NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
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í.

Diskuze – Převod z desítkové do libovolné soustavy

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jaroslav Gongala
Neregistrovaný
Avatar
Jaroslav Gongala:17.1.2012 23:16

Zdravíčko.
Rád bych se zeptal, jak udělat v pascalu program, kde člověk zadá jednu ze tři variant výpisu výsledku (varianta soustavy). Na začátku programu si zvolí do jaké soustavy chce převádět, potom zadá svoje číslo a na obrazovce se objeví číslo v jeho vybrané soustavě.
Trápím se s tím už dlouho.
Děkuji za odpověď,
Jaroslav Gongala.

 
Odpovědět
17.1.2012 23:16
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na
David Hartinger:18.1.2012 9:14

A z jaké soustavy chcete převádět?

Odpovědět
18.1.2012 9:14
New kid back on the block with a R.I.P
Avatar
Martin
Neregistrovaný
Avatar
Martin:12.10.2012 20:00

Taky jsem zkoušel udělat převodník do libovolné soustavy :)
A musím říct, že to je brutální zdroják :D
Jedinou nevýhodu, kterou to ještě má, že tam chybí 2 podmínky.
Pro záporná a desetinná místa :)

A vím, že zdroják je teoreticky špatně. Ale například pole[] jsem použil poprvé (teda pokud neberu zkopčené zdroje).

static void Main(string[] args)
        {
            bool pokracovat = true;
            bool platnaVolba = true;
            double A;
            string Výs = "";
            string Výs2 = "";
            // proměnné
            Console.WriteLine("Převod z desítkové do libovolné soustavy.\n");
            Console.WriteLine(@"Druhý výsledek je napsaný odděleně, protože
např. 16 soustava používá od čísla 10 písmena
A do čísla 15 tedy F, ale program zapisuje pouze čísla.");
            Console.WriteLine("\n=============================================");

            //start
            while(pokracovat == true)
            {
                Console.WriteLine("\nZadejte číslo:");
                double B; //číslo
                while (!double.TryParse(Console.ReadLine(), out B))
                {
                    Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
                }
                Console.WriteLine("Zadejte do které soustavy chcete číslo převést:");
                int C; //soustava
                while (!int.TryParse(Console.ReadLine(), out C))
                {
                    Console.WriteLine("Neplatné číslo, zadejte prosím znovu:");
                }

                A = B;
                int I = 0;
                Výs = "";
                Výs2 = "";

                if (A == 0)
                {
                    Výs = "0";
                    Výs2 = "0";
                }

                while (B > 0) //výpočet délky pole
                {
                    I = I + 1;
                    B = B / C;
                    B = Math.Floor(B);
                }

                double[] Z = new double[I+1];
                I = 0;
                while (A > 0) //převod
                {
                    B = A;
                    I = I + 1;
                    A = A / C;
                    A = Math.Floor(A);
                    Z[I] = B - A * C;
                }


                for (int X = 0; X < I; I--) //zápis
                {
                    Výs = Výs + Z[I];
                    Výs2 = Výs2 + Z[I] + " ";
                }

                Console.WriteLine("Výsledek: " + Výs);
                Console.WriteLine("Výsledek: " + Výs2);
                Console.WriteLine("Pokračovat ? [ano/ne]");
                platnaVolba = false;
                while (!platnaVolba) //znovu?
                {
                    switch (Console.ReadLine())
                    {
                        case "ano":
                            pokracovat = true;
                            platnaVolba = true;
                            break;
                        case "ne":
                            pokracovat = false;
                            platnaVolba = true;
                            Console.WriteLine("\nStiskněte libovolnou klávesu pro ukončení.");
                            Console.ReadKey();
                            break;
                        default:
                            Console.WriteLine("Neplatná volba, zadejte prosím ano/ne.");
                            break;
                    }
                }
            }
        }

Zdroják je pro C# console.
A v konzolích taky moc nedělám, ale je to dobrá výzva :)
Je to celkem podobné formulářím, ale ty se mi zdají lehčí :)

Tak mi spísni připomínky :)
Ať se něco přiučím. Ale počítá to i do (třeba) 189 soustavy :D
Zadané číslo by šlo opodmínkovat, aby nezadávalo desetiny přepsáním na INT. Ale když to přepíšu, tak potom nemůžu to číslo zaokrouhlit. :(

 
Odpovědět
12.10.2012 20:00
Avatar
stanikdvorak
Člen
Avatar
stanikdvorak:4.12.2012 18:10

Ahoj
Dostal jsem za úkol naprogramovat převod z desítkové soustavy do jiné o základu 2-16 jako desktopovou aplikaci v c# metodou postupného dělení. poradťe prosím jak?
Nemůžu furt přijít na to jak to dělení napsat do cyklu.

viz:

namespace WindowsFormsApplication1
{
    public partial class oknoProgramu : Form
    {
        public oknoProgramu()
        {
            InitializeComponent();
        }

        private void btnPreved_Click(object sender, EventArgs e)
        {
            int prevCislo;
            int soustava;
            int pomocna;
            int del;
            int pomocna2;
            string vypis = null;


            try
            {
                prevCislo = Convert.ToInt32(tbxCislo.Text);
                soustava = Convert.ToInt32(tbxSoustava.Text);
            }
            catch
            {
                MessageBox.Show("Zadaná chybná hodnota","CHYBA");
                return;
            }

            //kontrola

           tbxKontrola.Text  = Convert.ToString(prevCislo, soustava);

            //výsledek

           String[] vysledek = new string[100]; //deklarace pole

           pomocna = prevCislo % soustava;//3
           for (int i = 0; i < vysledek.Length; i++)
           {
            pomocna = prevCislo % soustava;//3
            del = prevCislo / soustava; //15
            vysledek[i] =Convert.ToString(pomocna) + Convert.ToString(del % soustava);

               }



         //vypsání pole
           for (int i = 0; i < vysledek.Length; i++)
           {
               vypis = vypis + Convert.ToString(vysledek[i]);

           }
           tbxVysledek.Text = vypis;
        }
    }
}
 
Odpovědět
4.12.2012 18:10
Avatar
matesax
Tvůrce
Avatar
Odpovídá na stanikdvorak
matesax:4.12.2012 19:06

Stačilo by trochu hledat - již jsem ty funkce psal...

private string ConvertToBase(int numberOfBase, int value)
{
    Stack<char> result = new Stack<char>();

    while (value > 0)
    {
        int rest = value % numberOfBase;
        result.Push(rest > 9 ? Convert.ToChar(rest + 55) : rest.ToString()[0]);
        value = (value - rest) / numberOfBase;
    }

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

private int ConvertFromBase(int numberOfBase, string value)
{
    int shelf = 0,
        result = 0;

    for (int index = 0; index < value.Length; index++)
    {
        char val = value[value.Length - index - 1];

        if (!int.TryParse(val.ToString(), out shelf))
            shelf = (int)val - 55;

        result += shelf * (int)Math.Pow(numberOfBase, index);
    }

    return result;
}

Je to omezeno pouze abecedou - takže je možné pracovat i třeba v 64 sousavě. Jak již namítl Kit - Pow je náročný - lepší by bylo využití Hornerova schématu - ale to už si udělej sám...

Editováno 4.12.2012 19:12
 
Odpovědět
4.12.2012 19:06
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 5 zpráv z 5.