IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – Prevod z desiatkovej do ľubovoľnej sústavy

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Jaroslav Gongala
Nevyplnené
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.

 
Odpovedať
17.1.2012 23:16
Avatar
David Hartinger
Vlastník
Avatar
Odpovedá na
David Hartinger:18.1.2012 9:14

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

Odpovedať
18.1.2012 9:14
New kid back on the block with a R.I.P
Avatar
Martin
Nevyplnené
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. :(

 
Odpovedať
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;
        }
    }
}
 
Odpovedať
4.12.2012 18:10
Avatar
matesax
Tvůrce
Avatar
Odpovedá 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...

Editované 4.12.2012 19:12
 
Odpovedať
4.12.2012 19:06
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!