Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Зайчик
Člen
Avatar
Зайчик:18.10.2012 22:48

Zdravím snažím se udělat převod nějakého čísla do binární soustavy vím jak to funguje a jak to má být ale v C# zaboha nemůžu přijít na to jak obrátit řetězec když mi zbytky vyjdou třeba "1001110" tak aby se to otočilo a bylo to" 0111001" kód mám takto
while (a != 0)
{
zbytek = a % 2;
Console.Write­Line("{0}", zbytek);
a = a / 2;
}
No a mám vlastně takovej řetězec jedniček a nul a teď to potřebuju obrátit vím jak to udělat v C ale v C# nějak nemám páru:( předem díky :)

Odpovědět
18.10.2012 22:48
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:18.10.2012 23:01
private int ConvertToBinary(int decimalNumber)
{
    string build = "";

    do
    {
        build = decimalNumber % 2 + build;
        decimalNumber = (decimalNumber - (decimalNumber % 2)) / 2;
    }
    while (decimalNumber != 0);

    return int.Parse(build);
}
Editováno 18.10.2012 23:03
 
Nahoru Odpovědět
18.10.2012 23:01
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Зайчик
Kit:18.10.2012 23:05

Tak jsem trochu zagooglil...

public static string ReverseString(string s) {
    char[] arr = s.ToCharArray();
    Array.Reverse(arr);
    return new string(arr);
}
Nahoru Odpovědět
18.10.2012 23:05
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:18.10.2012 23:12

... a pak se divíme, proč jsou dnešní aplikace tak líné. S kvadratickými algoritmy na nás nechoď.

Nahoru Odpovědět
18.10.2012 23:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:18.10.2012 23:17

A takto se to dá zobecnit:

private string ConvertToAnySystem(int decimalNumber, int system)
{
    string build = "";

    do
    {
        int parse = decimalNumber % system;
        build = (parse > 9 ? Convert.ToChar(55 + parse).ToString() : parse.ToString()) + build;
        decimalNumber = (decimalNumber - (decimalNumber % system)) / system;
    }
    while (decimalNumber != 0);

    return build;
}
:)

Absolutně libovolná soustava - třeba 64:

MessageBox.Show(ConvertToAnySystem(2000, 64) + "");

Co je na tom špatného?

 
Nahoru Odpovědět
18.10.2012 23:17
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:18.10.2012 23:22

Pořád tam máš dobu zpracování závislou na druhé mocnině délky čísla. Je to stejné, jako bys propagoval Bubble Sort jako nejlepší algoritmus pro řazení. Neumíš použít zásobník?

Nahoru Odpovědět
18.10.2012 23:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:18.10.2012 23:33

No já jsem to zkusil tou tvojí metodou a jaksi mi to stále píše třeba
50 DEC = 010011BIN; místo 110010BIN :D se tu přetahujete co je lepší ale mě by stačilo jen říct jak to obrátit :(

Nahoru Odpovědět
18.10.2012 23:33
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:19.10.2012 5:51

Tak mi vysvětli toto (příloha).

Je přímo nemožné, aby to moje nefungovalo... :)

To Kit - jaká druhá mocnina - kde ji vidíš? (Proč bych to dělal a pak otáčel? - 2 operace jsem nahradil jednou - rozhodně lepší...)

 
Nahoru Odpovědět
19.10.2012 5:51
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:19.10.2012 6:00

Jo doba - to ano - ale nemyslím si, že by to byla taková katastrofa.

Jee - já zase četl frontu (pardon) - toto není zásobník?

build = (parse > 9 ? Convert.ToChar(55 + parse).ToString() : parse.ToString()) + build;
Editováno 19.10.2012 6:03
 
Nahoru Odpovědět
19.10.2012 6:00
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:19.10.2012 6:21

Spokojen? :)

private string ConvertToAnySystem(int decimalNumber, int system)
{
    Stack<char> build = new Stack<char>();

    do
    {
        int parse = decimalNumber % system;
        build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
        decimalNumber = (decimalNumber - (decimalNumber % system)) / system;
    }
    while (decimalNumber != 0);

    return new string(build.ToArray());
}

Doporučuji 2000 do 100 soustavy... :)

 
Nahoru Odpovědět
19.10.2012 6:21
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:19.10.2012 7:09

Jo a opačný proces:

private int ConvertFromAnySystem(string number, int system)
{
    int build = 0;

    for (int index = number.Length - 1; index > -1; index--)
    {
        int who = 0;

        if (!int.TryParse(number[index].ToString(), out who))
            who = (int)number[index] - 55;

        build += (int)(who * Math.Pow(system, number.Length - 1 - index));
    }

    return build;
}
 
Nahoru Odpovědět
19.10.2012 7:09
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:19.10.2012 7:22

Hmm, to by už šlo. Jen si marně lámu hlavu nad tím, proč máš proměnné pojmenované takovým zvláštním způsobem. decimalNumber není v desítkové soustavě. V zásobníku build se nic nestaví a system neobsahuje nic ze systému, ale základ soustavy, což se překládá jako base. V proměnné parse máš zase zbytek po dělení, ale to slovo má jiný význam.

Možná by bylo lepší, kdybys názvy proměnných měl anglicky.

Nahoru Odpovědět
19.10.2012 7:22
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:19.10.2012 7:29

No jo - tak to první je zbytek z minula, a ostatní - Google Translate... :)
(Spěchám - škola - takže nemám čas myslet - jinak bych to přeložit dokázal... (Je jednodušší hodit to do translatoru.))

private string ConvertToAnyBase(int number, int numberOfBase)
{
    Stack<char> converted = new Stack<char>();

    do
    {
        int remainder = number % numberOfBase;
        converted.Push((remainder > 9 ? Convert.ToChar(55 + remainder) : remainder.ToString()[0]));
        number = (number - (number % numberOfBase)) / numberOfBase;
    }
    while (number != 0);

    return new string(converted.ToArray());
}

private int ConvertFromAnyBase(string number, int numberOfBase)
{
    int converted = 0;

    for (int index = number.Length - 1; index > -1; index--)
    {
        int who = 0;

        if (!int.TryParse(number[index].ToString(), out who))
            who = (int)number[index] - 55;

        converted += (int)(who * Math.Pow(numberOfBase, number.Length - 1 - index));
    }

    return converted;
}
Editováno 19.10.2012 7:32
 
Nahoru Odpovědět
19.10.2012 7:29
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:19.10.2012 7:46

A co tam dělá ten Math.Pow()? Neznáš Hornerovo schéma?

BTW: Převody mezi soustavami nejsou špatné jako cvičení, ale pro praktické použití bude lepší se spolehnout na standardní metodu ToString().

Nahoru Odpovědět
19.10.2012 7:46
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:19.10.2012 12:04

Fajn už to funguje :) děkuju :)

Nahoru Odpovědět
19.10.2012 12:04
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Зайчик:19.10.2012 16:09

Ještě bych se chtěl zeptat... chtěl bych si tu funci dát vlastně do jiného souboru Vypocet.cs normálně v kódu to funguje ale když to dám do nějakého souboru třeba do toho Vypocet.cs tak mi to nefunguje :(

class Vypocet
    {
        private string Decibin(int decimalnicislo, int delitel)
        {
            Stack<char> build = new Stack<char>();

            do
            {
                int parse = decimalnicislo % delitel;
                build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
                decimalnicislo = (decimalnicislo - (decimalnicislo % delitel)) / delitel;
            }
            while (decimalnicislo != 0);

            return new string(build.ToArray());
        }
    }

Takhle to mam v Vypocet.cs
a v program.cs mám

Vypocet vypocet = new Vypocet();
MessageBox.Show(vypocet.Decibin(10,2));

a to mi už háže chybku že ta funkce je nepřístupná
Error 1'Kalkulačka.Vy­pocet.Decibin(in­t, int)' is inaccessible due to its protection level

Poradil by mi někdo co mám špatně?

Nahoru Odpovědět
19.10.2012 16:09
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:19.10.2012 16:12

Je tam private - Google - C# modifikátory přístupu...

Místo private použíj public...

public string Decibin(int decimalnicislo, int delitel)
         {
             Stack<char> build = new Stack<char>();

             do
             {
                 int parse = decimalnicislo % delitel;
                 build.Push((parse > 9 ? Convert.ToChar(55 + parse) : parse.ToString()[0]));
                 decimalnicislo = (decimalnicislo - (decimalnicislo % delitel)) / delitel;
             }
             while (decimalnicislo != 0);

             return new string(build.ToArray());
         }

Proč nepoužiješ můj obecný zápis? A proč jsi to pojmenoval tak blbě? :) (Minimálně alespoň DecToBin...)

Editováno 19.10.2012 16:13
 
Nahoru Odpovědět
19.10.2012 16:12
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:19.10.2012 16:13

Ahá díky :) už si dám na takový kraviny bacha :)

Nahoru Odpovědět
19.10.2012 16:13
Коммунизм для нашего будущего!
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:19.10.2012 16:16

jo jsem ten zbytek přečetl až pak :D no takhle jsem si to udělal protože první jsem zkusil jestli to jde :) a pak jsem zkoumal čím to je že moje verze nešla a tvoje jde :) tak jsem to zkoumal :) a až jsem to pobral tak jsem si změnil proměnné pro mojí přehlednost :)

Nahoru Odpovědět
19.10.2012 16:16
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:19.10.2012 16:21

V OOP se píše obecně - pak si jen dosadíš svoje - jde o to, že pak daný soubor / objekt / třídu můžeš používat i v jiných projektech...

 
Nahoru Odpovědět
19.10.2012 16:21
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:19.10.2012 16:26

To nic nemění, na tom že jsou to jen proměnné ty se v OOP můžou psát uplný kraviny pokud vím... a ve výsledném souboru program.cs akorát název té funkce a parametry nevím proč by to mělo tak vadit

Nahoru Odpovědět
19.10.2012 16:26
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:19.10.2012 16:32

A jak se v tom pak vyznáš? A jak se v tom vyzná jiný programátor - chcěš-li být programátor, tak k výměně zdrojáků docházet bude. (V práci, teamu...) Ne-li budeš-li chtít to pulikovat - pro méně zkušené...

Editováno 19.10.2012 16:33
 
Nahoru Odpovědět
19.10.2012 16:32
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Зайчик
David Hartinger:19.10.2012 16:35

Většinou si projekt rozdělíš na komponenty (teď myslím třídy), nějaké budou samozřejmě jen pro ten projekt, ale měl by ses to snažit vymyslet tak, abys jich co nejvíce mohl použit i jinde nebo alespoň po menší úpravě. Třeba tyhle převody by se krásně daly dát do nějaké třídy pro práci s formáty.

Editováno 19.10.2012 16:38
Nahoru Odpovědět
19.10.2012 16:35
You are the greatest project you will ever work on.
Avatar
Kit
Tvůrce
Avatar
Odpovídá na David Hartinger
Kit:19.10.2012 16:59

Tyhle metody s převody přece už dávno jsou v systémových třídách.

Nahoru Odpovědět
19.10.2012 16:59
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Kit
matesax:19.10.2012 17:04

Ale to je přeci moc jednoduché - sám jsi psal, že se na tom dá dobře procvičit... :)

Editováno 19.10.2012 17:07
 
Nahoru Odpovědět
19.10.2012 17:04
Avatar
Kit
Tvůrce
Avatar
Odpovídá na matesax
Kit:19.10.2012 17:07

Procvičit ano, ale nedávat to do projektů.

Nahoru Odpovědět
19.10.2012 17:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Зайчик:19.10.2012 22:52

Už to k tomuhle vůbec nepatří ale nechci spamovat fórum takže mám další otázečku.

Udělal jsem si 2.Form do něj jsem se dostal pomocí :

private void změnaNickuToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Zmena_nicku myForm2 = new Zmena_nicku();
            myForm2.ShowDialog();
            myForm2.Dispose();
        }

v novém souboru jsem si tedy změnil nick a zapsal do souboru pomocí:

private void potvrzeni_Click(object sender, EventArgs e)
        {
            string nick;
            nick = zmenanicku.Text;
            using (StreamWriter sw = new StreamWriter(@"Data/nick.txt"))
            {
                sw.WriteLine(nick);
                sw.Flush();
            }

A nyní bych potřeboval zase z5 do Form1 protože mi nefunguje vlastně label v main formu. Zkoušel jsem to normálně

using (StreamReader sr = new StreamReader(@"Data/nick.txt"))
            {
                string s;
                while ((s = sr.ReadLine()) != null)
                {
                    Main hlavni = new Main();
                    nick.Text = s;

                }
            }

Ale v nick.Text mi to píše že nick.Text není :( poradil by mi někdo ? Vím že je to úplná blbost a asi se mi budete smát :D ale já se stim peru už hodinu :D a zkoušim všechno možné :(
BTW : potřebuju to aby se mi vlastně po zadaní nového nicku přepsal v souboru ten starý a nahradil se okamžitě i v aplikaci novým.

Nahoru Odpovědět
19.10.2012 22:52
Коммунизм для нашего будущего!
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Зайчик
Kit:19.10.2012 23:10

Moc tomu nerozumím, ale koukám, že nemáš definován objekt nick.

Nahoru Odpovědět
19.10.2012 23:10
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na Kit
Зайчик:19.10.2012 23:12

To se také musí dávat do objektu? Však je to jen label :(

Nahoru Odpovědět
19.10.2012 23:12
Коммунизм для нашего будущего!
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Зайчик
matesax:20.10.2012 7:22

Coo - chceš se spojit s mateřským formem? Máš 2 možnosti - vzít druhý form jako mateřský, ale nezobrazovat jej - a label přidat do Formu prvního:

Ve Formu druhém:

private Label nick = nev Label();
private Form1 xxx = new Form1();

public Form2()
{
xxx.Show();
xxx.Controls.Add(nick);
nick.Text = "...";
...

Ovšem pokud chceš něco měnit i ve Formu1 (v tom labelu), tak opět ve formu druhém:

private Form1 mum = null;

public Form2(Form1 mum)
{
this.mum = mum;

...

mum.nick.Text = "";

A v mateřském:

new Form2(this).Show();

Jenže v té druhé možnosti by musel být label public. Leda by jsi udělal most (V mateřském.):

public string Nic
{
get { return nick.Text; }
set { nick.Text = value; }
}

A pak skoro stejně:

private Form1 mum = null;

public Form2(Form1 mum)
{
this.mum = mum;

...

mum.Nick = "";

\---

Editováno 20.10.2012 7:26
 
Nahoru Odpovědět
20.10.2012 7:22
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:20.10.2012 7:29

nev = new,
nic = nick... :)

Vůbec nejlepší ale je, když takováto potřeba ani nenastane... (Dá se to tak vymyslet snad vždy.)

 
Nahoru Odpovědět
20.10.2012 7:29
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Зайчик
Kit:20.10.2012 8:39

Píšeš, že nick je třídy Label. V jedné metodě vytváříš objekt nick třídy String. V jiné metodě přistupuješ k jeho atributu Text, který ve třídě String není, ale je ve třídě Label. Jak to tedy je?

Nahoru Odpovědět
20.10.2012 8:39
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Зайчик
Člen
Avatar
Odpovídá na matesax
Зайчик:20.10.2012 14:09

Tak už jsem to vyřešil trošku jiným způsobem :) od tebe jsem to moc nepochopil tak jsem si vzal jen tu větu "Vůbec nejlepší ale je, když takováto potřeba ani nenastane... (Dá se to tak vymyslet snad vždy.)" :) a udělal jsem to jinak a už to funguje :) Dík

Nahoru Odpovědět
20.10.2012 14:09
Коммунизм для нашего будущего!
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 33 zpráv z 33.