Zamiana z systemu dziesiętnego na dowolny

Zamiana liczby zapisanej w systemie dziesiętnym na inny odbywa się jednakowa metoda niezależnie od podstawy systemu, na który jest zamieniana podana liczba zapisana w systemie dziesiętnym. Jedyną różnicą jest odpowiednie ograniczenie możliwych znaków (w tym cyfr) przeznaczonych do zakodowania zamienianej liczby w nowym systemie.

Przykładowo w systemie dwójkowym (binarnym) dostępnych znaków do przeznaczonych do kodowania jest dwa (0,1). W systemie piątkowym będzie ich już pięć (0,1,2,3,4). W szesnastkowym będzie ich szesnaście (0,1..9,A,B,C,D,E). Ogólnie można sobie wymyślić dowolny system oparty na dowolnej ilości znaków kodujących wartości liczbowe z systemu dziesiętnego

Metoda zamiany liczby całkowitej z systemu dziesiętnego na dwójkowy

Chcąc zapisać liczbę z systemu dziesiętnego na przykład w systemie dwójkowym (binarnym) wykonujemy dzielenie z resztą tej liczby przez dwa (podstawę systemu docelowego), zapisujemy wszystkie reszt z dzieleń do momentu otrzymania ilorazu równego zero. Wynikiem jest odczyt od końca kolejnych reszt.

Na przykład: jakie jest rozwinięcie binarne liczby dziesiętnej 749(10)=?(2)

Uwaga: Operator div oznacza część całkowitą z dzielenia, operator mod oznacza resztę z dzielenia. W języku C# użyjemy operatorów arytmetycznych / (jako div) i % (jako mod)

wyznaczenie rozwinięcia dwójkowego liczby dziesiętnej

749(10) = 1011101101(2)

Metoda zamiany liczby całkowitej z systemu dziesiętnego na szesnastkowy

Wyznaczanie rozwinięcia szesnastkowego liczby dziesiętnej odbywa się na tych samych zasadach co rozwinięcia binarnego liczby dziesiętnej z tą różnicą, że podstawą jest liczba 16.

Chcąc zapisać liczbę z systemu dziesiętnego w systemie szesnastkowym wykonujemy dzielenie z resztą tej liczby przez 16 (podstawę systemu docelowego), zapisujemy wszystkie reszt z dzieleń do momentu otrzymania ilorazu równego zero. Każdą z reszt większą od 9 zamieniamy na odpowiedni symbol literowy. Wynikiem jest odczyt od końca kolejnych reszt.

Na przykład: jakie jest rozwinięcie szesnastkowe liczby dziesiętnej 749(10) ?

wyznaczanie rozwinięcia szesnastkowego liczby dziesiętnej

749(10) = 2ED(16)

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą iteracyjną

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą iteracyjną

Schemat przedstawia funkcję dwuargumentową. Pierwszy argument (int l) to wartość zamienianej liczby z systemu dziesiętnego, drugi argument (byte p) to podstawa systemu, na który jest przeprowadzana zamiana. Funkcja zwraca wynik w postaci łańcucha znaków (typ String)

Kod funkcji realizujący iteracyjną zamianę liczby dziesiętnej na dowolny system liczbowy zapisany w C#


private String zamiana10naInnyIteracja(int l, byte p)
{
	String wynik = "";
	while (l > 0)
		{
		if (l % p > 9)
			switch (l%p){
			  case 10: wynik = "A" + wynik;break;
			  case 11: wynik = "B" + wynik; break;
			  case 12: wynik = "C" + wynik; break;
			  case 13: wynik = "D" + wynik; break;
			  case 14: wynik = "E" + wynik; break;

			}
			else wynik = (l % p).ToString() + wynik;
			l = l / p;
		}
	return wynik;
}

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą rekurencyjną

Schemat algorytmu zamiany liczby z systemu dziesiętnego na dowolny metodą rekurencyjną

Schemat przedstawia funkcję dwuargumentową. Pierwszy argument (int l) to wartość zamienianej liczby, drugi argument (byte p), to podstawa systemu na, który jest przeprowadzana zamiana. Wynikiem jest łańcuch znaków (typ String)

Kod funkcji rekurencyjnego zamieniania liczby z systemu dziesiętnego na dowolny zapisany w języku C# przedstawiam poniżej


private String zamiana10naInnyRekurencja(int l,byte p)
{
	String wynik="";
	if (l > 0)
	{
		wynik+=zamiana10naInnyRekurencja(l / p, p);
		if (l % p > 9)
			switch (l % p)
			{
				case 10: wynik += "A"; break;
				case 11: wynik += "B"; break;
				case 12: wynik += "C"; break;
				case 13: wynik += "D"; break;
				case 14: wynik += "E"; break;
				case 15: wynik += "F"; break;
			}
		else wynik+= (l % p).ToString();
	}  
	return wynik;
}

Aplikacja realizująca obie metody

Przykładowa aplikacja realizująca obie metody wygląda jak poniżej

aplikacja zamiany liczby z systemu dziesiętnego na dowolny

Plik z kodem formatki


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _1AlgPozycyjneReprezentacjeliczb
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private String zamiana10naInnyIteracja(int l, byte p)
        {
            String wynik = "";
            while (l > 0)
            {
                if (l % p > 9)
                    switch (l % p)
                    {
                        case 10: wynik = "A" + wynik; break;
                        case 11: wynik = "B" + wynik; break;
                        case 12: wynik = "C" + wynik; break;
                        case 13: wynik = "D" + wynik; break;
                        case 14: wynik = "E" + wynik; break;

                    }
                else wynik = (l % p).ToString() + wynik;
                l = l / p;
            }
            return wynik;
        }
        private String zamiana10naInnyRekurencja(int l, byte p)
        {
            String wynik = "";
            if (l > 0)
            {
                wynik += zamiana10naInnyRekurencja(l / p, p);
                if (l % p > 9)
                    switch (l % p)
                    {
                        case 10: wynik += "A"; break;
                        case 11: wynik += "B"; break;
                        case 12: wynik += "C"; break;
                        case 13: wynik += "D"; break;
                        case 14: wynik += "E"; break;
                        case 15: wynik += "F"; break;
                    }
                else wynik += (l % p).ToString();
            }
            return wynik;
        }

        private byte Wartosc(Char znak)
        {
            byte a = 0;
            switch (znak)
            {
                case 'A': a = 10; break;
                case 'B': a = 11; break;
                case 'C': a = 12; break;
                case 'D': a = 13; break;
                case 'E': a = 14; break;
                case 'F': a = 15; break;
                default: a = Convert.ToByte(znak - '0'); break;
            }
            return a;
        }
        //s- to łańcuch znaków podanej liczby
        //p- podstawa systemu
        private long DowolnyNaDziesietny(String s, byte p)
        {
            long wynik = 0;
            int i = 0;
            while (i < s.Length - 1)
            {
                wynik = (wynik + Wartosc(s[i])) * p;
                i++;
            }
            wynik += Wartosc(s[i]);
            return wynik;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //ustaw pierwszy indeks w combobox na aktywny
            comboBox1.SelectedIndex = 0;
            comboBox2.SelectedIndex = 0;
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            //zabezpiecz przed znakami nienumerycznymi
            if (e.KeyChar == 8) return;//wyskocz jak BackSpace
            if (e.KeyChar < '0' || e.KeyChar > '9') e.Handled = true;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!", 
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            int l = Convert.ToUInt16(textBox1.Text);
            byte p = Convert.ToByte(comboBox1.Text);
            if (l > 0) label3.Text = zamiana10naInnyRekurencja(l, p);
            else label3.Text = "0";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!",
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            int l = Convert.ToUInt16(textBox1.Text);
            byte p = Convert.ToByte(comboBox1.Text);
            if (l > 0) label3.Text = zamiana10naInnyIteracja(l, p);
            else label3.Text = "0";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //zamień z dwolonego na dziesietny
            if (textBox2.Text.Length < 1)
            {
                MessageBox.Show("Nie podano liczby!", 
                                "Komunikat",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Warning);
                return;
            }
            byte p = Convert.ToByte(comboBox2.Text);
            label4.Text = DowolnyNaDziesietny(textBox2.Text, p).ToString();
        }
    }
}

Kod programu w C# (rozwiązanie pod konsolę)

Zwróć uwagę, że metody opisujące funkcje są zdefiniowane jako statyczne (patrz słowo kluczowe static). Poniższy kod zawiera dwie funkcje zamieniające podaną wartość liczbową z systemu dziesiętnego na dowolny. Jedna z funkcji przy zamianie wykorzystuje iterację, druga wykorzystuje rekurencję.

Wskazówka:


namespace alg1_zamiana_z_dziesietnego_na_dowolny_c_h
{
    internal class Program
    {
        static String zamiana10naInnyIteracja(int l,byte p)
        {
            String wynik = "";
            while(l>0)
            {
                if(l%p>9)
                    switch(l%p)
                    {
                        case 10: wynik = "A" + wynik;break;
                        case 11: wynik = "B" + wynik; break;
                        case 12: wynik = "C" + wynik; break;
                        case 13: wynik = "D" + wynik; break;
                        case 14: wynik = "E" + wynik; break;
                        case 15: wynik = "F" + wynik; break;
                    }
                else wynik=(l%p).ToString()+wynik;
                l=l/p;
            }
            return wynik;
        }

        static String zamiana10naInnyRekurencja(int l, byte p)
        {
            String wynik = "";
            if (l > 0)
            {
                wynik += zamiana10naInnyRekurencja(l / p, p);
                if (l % p > 9)
                    switch (l % p)
                    {
                        case 10: wynik += "A"; break;
                        case 11: wynik += "B"; break;
                        case 12: wynik += "C"; break;
                        case 13: wynik += "D"; break;
                        case 14: wynik += "E"; break;
                        case 15: wynik += "F"; break;
                    }
                else wynik += (l % p).ToString();
            }
            return wynik;
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Witaj w CzD!");
            Console.WriteLine("Zamiana z systemu dziesiętnego na dowolny");
            Console.WriteLine("Podaj liczbę dziesiętną:");
            int l = Convert.ToInt16(Console.ReadLine());
            Console.WriteLine("Podaj podstawę systemu (2<=p<=16)");
            byte p = Convert.ToByte(Console.ReadLine());
            Console.WriteLine("Wartość liczby dziesiętnej w wybranym systemie:");
            Console.WriteLine(zamiana10naInnyIteracja(l, p)+" (iteracja)");
            Console.WriteLine(zamiana10naInnyRekurencja(l, p) + " (rekurencja)");
        }
    }
}

Wynik działania programu

zamiana10naInnyIteracja c#

Kod programu w C++

Przyjęte rozwiązanie wykorzystuje typ łańcuchowy (string) do przechowywani kolejnych cyfr jak i symboli A, B..F zgodnie z ich pozycją w danym systemie pozycyjnym. Takie rozwiązanie nie wymaga stosowania tablic. W pewnym senesie typ string jest tablicą, w której na kolejnych indeksach przechowywane są znaki. Chcąc wykorzystać konwersję liczb na typ łańcuchowy w języku C++ należy zadeklarować wykorzystanie biblioteki sstream

Wskazówka:

 
#include <iostream>
#include <string.h>
#include<sstream> 

using namespace std;

Funkcja która przeprowadza tę konwersję to to_string(

Kod programu w zapisany w c++

Wskazówka:

 
#include <iostream>
#include <string.h>
#include<sstream> 

using namespace std;

string zamiana10naInnyIteracja(int l, int p)
{
    string wynik = "";
    while (l > 0)
    {
        if (l % p > 9)
            switch (l % p)
            {
            case 10: wynik = "A" + wynik; break;
            case 11: wynik = "B" + wynik; break;
            case 12: wynik = "C" + wynik; break;
            case 13: wynik = "D" + wynik; break;
            case 14: wynik = "E" + wynik; break;
            case 15: wynik = "F" + wynik; break;
            }
        else wynik = to_string(l % p) + wynik;
        l = l / p;
    }
    return wynik;
}

string zamiana10naInnyRekurencja(int l, int p)
{
    string wynik = "";
    if (l > 0)
    {
        wynik += zamiana10naInnyRekurencja(l / p, p);
        if (l % p > 9)
            switch (l % p)
            {
            case 10: wynik += "A"; break;
            case 11: wynik += "B"; break;
            case 12: wynik += "C"; break;
            case 13: wynik += "D"; break;
            case 14: wynik += "E"; break;
            case 15: wynik += "F"; break;
            }
        else wynik += to_string(l % p);
    }
    return wynik;
}

int main()
{
    cout << "Witaj w CzD!\n";
    cout << "Zamian liczby dziesietnej na dowolny sustem\n";
    cout << "Podaj liczbe z systemu dziesietnego\n";
    int l;
    cin >> l;
    cout << "Podaj podstawe systemu (2<=p<=16)\n";
    int p;
    cin >> p;
    cout<<"Wartosc liczby dziesietnej w wybranym systemie:\n";
    cout<< zamiana10naInnyIteracja(l, p) + " (iteracja)\n";
    cout<< zamiana10naInnyRekurencja(l, p) + " (rekurencja)\n";
}

Wynik działania programu

zamiana10naInnyRekurencja c++
Alkomat- wirtualny test

Alkomat- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
Olinowanie stałe- kalkulator średnic

Olinowanie stałe- darmowa aplikacja na Androida

Pobierz ze sklepu Google Play
przepis na gogfry

Przepis na gofry

zobacz
przepis na bitą śmietanę

Przepis na bitą śmietanę

zobacz