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

Algoritmy Matematické Převod z desítkové do libovolné soustavy

Zdrojový kód [PASCAL]

{ nasleduji funkce prevede libovolne cislo z desitkove soustavy do libovolne soustavy }
{ volani: convert(3,2) = 11 (tri do dvojkove je 11) }
function convert(a,n : integer) : string;
var i : integer;
    s,s2 : string;
begin
 s:='';
 while (a <> 0) do begin
  if ((a mod n) > 9) then
  s:=s + chr(ord('a') + (a mod n) - 10) else begin
   str((a mod n),s2);
   s:=s + s2;
  end;
  a:=a div n;
 end;
 s2:=s;
 for i:=length(s) downto 1 do s[i]:=s2[(length(s)) - i + 1];
 convert:=s;
end;

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Všechny články v sekci
Matematické algoritmy
Miniatura
Následující článek
Conwayova hra života

 

 

Komentáře

Avatar
Jaroslav Gongala
Neregistrovaný
Avatar
Jaroslav Gongala:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Jaroslav Gongala
David Čápka:

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

Odpovědět 18.1.2012 9:14
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Martin
Neregistrovaný
Avatar
Martin:

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:

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
Redaktor
Avatar
Odpovídá na stanikdvorak
matesax:

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.