Форум программистов, компьютерный форум CyberForum.ru

Перевод чисел в разные системы счисления - Android

Восстановить пароль Регистрация
 
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 15:34     Перевод чисел в разные системы счисления #1
Добрый день, когда то нашел код для перевода чисел в разные системы, но он на С# я его там для своей программы использовал, сейчас решим сделать чтобы и на андроид работало, но так как я понял я неправильно переделал код, так как программа работает некорректно, посмотрите оригинальный код пожалуйста:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/// <summary>
        /// Переводит из деятичной системы счисления в систему счисления с основанием N
        /// </summary>
        /// <param name="number">Число, которое переводим </param>
        /// <param name="sys">Система счисления, в которую переводим</param>
        /// <returns>Возвращает переведенное число в строковом формате</returns>
        private string ToN(string number, string sys)
        {
            string newNum = "";
            int num = Convert.ToInt32(number);
            int chast = Convert.ToInt32(number);
            ArrayList numTemp = new ArrayList();
            while(chast>0)
            {
                chast = chast / Convert.ToInt32(sys);
                numTemp.Add(num - chast * Convert.ToInt32(sys));
                num = chast;
            }
            int j;
            for (j=numTemp.Count-1; j >= 0; j--)
                newNum += newCh(numTemp[j].ToString(),"to");
            return newNum;
        }
        /// <summary>
        /// Функция, заменяет буквы на числа и наоборот
        /// </summary>
        /// <param name="sym">Число, над которым нужно работать</param>
        /// <param name="otk">В какую сторону осуществляется действие относительно десятичной системы счисления</param>
        /// <returns>Возвращает букву, если числу соответствует буква и наоборот, иначе число</returns>
        string newCh(string sym,string otk)
        {
            string s = "";
            if (otk == "to")
            {
                if (Convert.ToInt32(sym) > 10)
                    s += bukv.Substring(Convert.ToInt32(sym) - 10, 1);
                else
                    s += sym;
            }
            else if (otk == "from")
            {
                if (bukv.IndexOf(sym)==-1)
                    s += sym;
                else
                    s += (bukv.IndexOf(sym) + 10).ToString();
            }
            return s;
        }
 
 
        /// <summary>
        /// Переводит системы счисления с основанием N в деятичную систему счисления 
        /// </summary>
        /// <param name="number">Число, которое переводим </param>
        /// <param name="sys">Система счисления, из которой переводим</param>
        /// <returns>Возвращает переведенное число в строковом формате</returns>
        private string FromN(string number, string sys)
        {
            int newNum = 0;
            string temp = "";
            int t;
            int i;
            for (i = 0; i < number.Length; i++)
            {
                temp = "";
                temp += newCh(number.Substring(i, 1), "from");
                t=(int)Math.Pow(Convert.ToDouble(sys),Convert.ToDouble(number.Length-(i+1)));
                newNum += Convert.ToInt32(temp) * t;
            }
            return newNum.ToString();
        }
        private string FromTo(string number, string sysN, string sysK)
        {
            string temp="";
            temp=FromN(number, sysN);
            temp = ToN(temp, sysK);
            return temp;
        }
а это то, что я писал в java:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/// <summary>
    /// Переводит из деятичной системы счисления в систему счисления с основанием N
    /// </summary>
    /// <param name="number">Число, которое переводим </param>
    /// <param name="sys">Система счисления, в которую переводим</param>
    /// <returns>Возвращает переведенное число в строковом формате</returns>
    private String ToN(String number, String sys)
    {
        String newNum = "";
        int num = Integer.valueOf(number);
        int chast = Integer.valueOf(number);
        ArrayList numTemp = new ArrayList();
        while (chast > 0)
        {
            chast = chast / Integer.valueOf(sys);
            numTemp.add(num - chast * Integer.valueOf(sys));
            num = chast;
        }
        int j;
        for (j = numTemp.size() - 1; j >= 0; j--)
            newNum += newCh((numTemp.get(j).toString()), "to");
        return newNum;
    }
 
    /// <summary>
    /// Функция, заменяет буквы на числа и наоборот
    /// </summary>
    /// <param name="sym">Число, над которым нужно работать</param>
    /// <param name="otk">В какую сторону осуществляется действие относительно десятичной системы счисления</param>
    /// <returns>Возвращает букву, если числу соответствует буква и наоборот, иначе число</returns>
    String newCh(String sym, String otk)
    {
        String s = "";
        if (otk == "to")
        {
            if (Integer.valueOf(sym) > 9)
                s += bukv.substring(Integer.valueOf(sym) - 10, 1);
            else
                s += sym;
        }
        else if (otk == "from")
        {
            if (bukv.indexOf(sym) == -1)
                s += sym;
            else
                s += Integer.toString(bukv.indexOf(sym) + 10);
        }
        return s;
    }
 
    /// <summary>
    /// Переводит системы счисления с основанием N в деятичную систему счисления
    /// </summary>
    /// <param name="number">Число, которое переводим </param>
    /// <param name="sys">Система счисления, из которой переводим</param>
    /// <returns>Возвращает переведенное число в строковом формате</returns>
    private String FromN(String number, String sys)
    {
        int newNum = 0;
        String temp = "";
        int t;
        int i;
        for (i = 0; i < number.length(); i++)
        {
            temp = "";
            temp += newCh(number.substring(i, 1), "from");
            t = (int)Math.pow(Double.valueOf(sys), Double.valueOf(number.length() - (i + 1)));
            newNum += Integer.valueOf(temp) * t;
        }
        return Integer.toString(newNum);
    }
 
    private String FromTo(String number, String sysN, String sysK)
    {
        String temp = "";
        temp = FromN(number, sysN);
        temp = ToN(temp, sysK);
        return temp;
    }
скажите пожалуйста что не так, спасибо за помощь)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
не спать!
1870 / 1604 / 493
Регистрация: 12.05.2014
Сообщений: 5,806
Завершенные тесты: 1
24.12.2015, 15:54     Перевод чисел в разные системы счисления #2
а не проще делать так?
Java
1
Integer.toString(42, 2)
переводит число 42 в двоичную систему
вместо 42 и 2 можно ставить свои аргументы
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 15:55  [ТС]     Перевод чисел в разные системы счисления #3
ну просто у меня этот код классно работал) я хотел застусуваты здесь, подскажите что не так?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
24.12.2015, 17:36     Перевод чисел в разные системы счисления #4
Taras_lebdyk, строки в java не сравниваются посредством "==".
Используй equals
Java
1
if (otk.equals("to"))...
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 21:35  [ТС]     Перевод чисел в разные системы счисления #5
не помогло (наверное что-то не так переписал еще (может где-то с типами данных напутав (
метод ToN работает хорошо, а проблема мне кажется с newCh а именно во второй части
Java
1
2
3
4
5
6
7
else if (otk.equals("from"))
        {
            if (bukv.indexOf(sym) == -1)
                s += sym;
            else
                s += Integer.toString(bukv.indexOf(sym) + 10);
        }
и в методе FromN наверное тоже ошибка есть

Добавлено через 3 часа 26 минут
ну помогите (что здесь не так (
перевод с 10 системы n работает на отлично а с n в 10 или n в p программа выбивает (

Добавлено через 8 минут
и еще у меня подсвечивает код в этом месте может что-то не так записано ?
Миниатюры
Перевод чисел в разные системы счисления  
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
24.12.2015, 21:55     Перевод чисел в разные системы счисления #6
Цитата Сообщение от Taras_lebdyk Посмотреть сообщение
а с n в 10 или n в p программа выбивает (

Что в logcat??
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 22:00  [ТС]     Перевод чисел в разные системы счисления #7
что-то такое

Process: com.example.tlp.calculator, PID: 1821
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
at android.view.View.performClick(View.java:4438)*
at android.view.View$PerformClick.run(View.java:18422)*
at android.os.Handler.handleCallback(Handler.java:733)*
at android.os.Handler.dispatchMessage(Handler.java:95)*
at android.os.Looper.loop(Looper.java:136)*
at android.app.ActivityThread.main(ActivityThread.java:5001)*
at java.lang.reflect.Method.invokeNative(Native Method)*
at java.lang.reflect.Method.invoke(Method.java:515)*
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)*
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)*
at dalvik.system.NativeStart.main(Native Method)*
Caused by: java.lang.StringIndexOutOfBoundsException: length=4; regionStart=2; regionLength=-1
at java.lang.String.startEndAndLength(String.java:588)
at java.lang.String.substring(String.java:1475)
at com.example.tlp.calculator.MainActivity.FromN(MainActivity.java:276)
at com.example.tlp.calculator.MainActivity.button_Click(MainActivity.java:122)
at java.lang.reflect.Method.invokeNative(Native Method)*
at java.lang.reflect.Method.invoke(Method.java:515)*
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)*
at android.view.View.performClick(View.java:4438)*
at android.view.View$PerformClick.run(View.java:18422)*
at android.os.Handler.handleCallback(Handler.java:733)*
at android.os.Handler.dispatchMessage(Handler.java:95)*
at android.os.Looper.loop(Looper.java:136)*
at android.app.ActivityThread.main(ActivityThread.java:5001)*
at java.lang.reflect.Method.invokeNative(Native Method)*
at java.lang.reflect.Method.invoke(Method.java:515)*
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)*
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)*
at dalvik.system.NativeStart.main(Native Method)*
12-24 13:56:38.862 365-409/? E/SoundPool: error loading /system/media/audio/ui/Effect_Tick.ogg
12-24 13:56:38.922 365-409/? E/SoundPool: error loading /system/media/audio/ui/Effect_Tick.ogg
12-24 13:56:38.922 365-409/? E/SoundPool: error loading /system/media/audio/ui/Effect_Tick.ogg
12-24 13:56:38.932 365-409/? E/SoundPool: error loading /system/media/audio/ui/Effect_Tick.ogg
12-24 13:56:38.932 365-409/? E/SoundPool: error loading /system/media/audio/ui/Effect_Tick.ogg
12-24 13:56:38.932 365-409/? E/SoundPool: error loading /system/media/audio/ui/KeypressStandard.ogg
12-24 13:56:38.942 365-409/? E/SoundPool: error loading /system/media/audio/ui/KeypressSpacebar.ogg
12-24 13:56:38.942 365-409/? E/SoundPool: error loading /system/media/audio/ui/KeypressDelete.ogg
12-24 13:56:38.942 365-409/? E/SoundPool: error loading /system/media/audio/ui/KeypressReturn.ogg
12-24 13:56:38.942 365-409/? E/SoundPool: error loading /system/media/audio/ui/KeypressInvalid.ogg
12-24 13:56:39.002 365-393/? E/InputDispatcher: channel 'b40959f0 com.example.tlp.calculator/com.example.tlp.calculator.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
01-01 00:00:00.000 0-0/? E/Internal: Удаленный хост принудительно разорвал существующее подключение
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
24.12.2015, 22:24     Перевод чисел в разные системы счисления #8
Java
1
temp += newCh(number.substring(i, 1), "from");
substring() в C# и substring() в java - это две ПРИНЦИПИАЛЬНО разные (по "алгоритму", а не по результату) вещи - перечитай их описания и сделай как нужно

Цитата Сообщение от Taras_lebdyk Посмотреть сообщение
и еще у меня подсвечивает код в этом месте может что-то не так записано ?
Не особо вникая предположу, что ноги растут отсюда

java.lang.Math.pow(double a, double b)
и
static Double valueOf(double d)
Returns a Double instance representing the specified double value.
Функция pow просит примитив double, а не объект Double и система видит, что ей все эти лишние телодвижения с "переводом" объекта в примитив по итогу можно и не делать, если код подправить на
Java
1
 t = (int)Math.pow(Double.valueOf(sys), (double) (number.length() - (i + 1)));
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 22:36  [ТС]     Перевод чисел в разные системы счисления #9
спасибо но substring используется для перевода с 10 системы в n систему и это работает правильно,но я посмотрю потом и переделаю
сделал это
Java
1
t = (int)Math.pow(Double.valueOf(sys), (double) (number.length() - (i + 1)));
но к сожалению все то же (в чом может быть ошибка (
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
24.12.2015, 22:40  [ТС]     Перевод чисел в разные системы счисления #10
я пересмотрел все и еще заметил что здесь тоже подсвечивается,
Java
1
if (bukv.indexOf(sym) == -1)
и это тоже отвечает за перевод с n системы в 10 может здесь корень зла? потому что больше я не знаю в чем может быть проблема (
Миниатюры
Перевод чисел в разные системы счисления  
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
24.12.2015, 22:50     Перевод чисел в разные системы счисления #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Taras_lebdyk Посмотреть сообщение
и это работает правильно

Ню-ню...
Мы с системой дураки, а вы - самый умный

Система вам говорит
Caused by: java.lang.StringIndexOutOfBoundsException: length=4; regionStart=2; regionLength=-1
at java.lang.String.startEndAndLength(String.java:588)
at java.lang.String.substring(String.java:1475)
at com.example.tlp.calculator.MainActivity.FromN(MainActivity.java:276)
что есть выход за границы массива.

Я же вам к тому же говорю, что логика работы указанных функций - совершенно разная - в то время как в C# "вырезается" количество символов со стартовой позиции, то в Java выреается между стартовой и конечной позициями.

Впрочем, если вы и дальше не намерены читать и анализировать, то на этом сеанс и закончим
Taras_lebdyk
1 / 1 / 0
Регистрация: 17.09.2013
Сообщений: 245
25.12.2015, 09:08  [ТС]     Перевод чисел в разные системы счисления #12
Простите меня, действительно я не разобрался в сути проблемы, ошибка была там где Вы говорили, благодарю Вас за помощь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2015, 10:01     Перевод чисел в разные системы счисления
Еще ссылки по теме:

Android Разделить полученное SMS на разные TextView
Android Код под разные версии api
Android Разные стили для разных тем
Android Разные стили DialogFragment
Перевод между системами счисления Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
25.12.2015, 10:01     Перевод чисел в разные системы счисления #13
Бывает
Yandex
Объявления
25.12.2015, 10:01     Перевод чисел в разные системы счисления
Ответ Создать тему
Опции темы

Текущее время: 16:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru