Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > перевод в системах исчисления


Автор: Гость_Евгений 30.11.2005, 13:23
На днях задали задание написать реферат на тему "позиционные системы исчисления "
1.Должны быть описанны 2,8,16-ричные системы исчисления.
2.Описанно представление в памяти примитивных данных.
3.Написано приложенние на Java по переводу из 10ой во 2ую и16ую системы и обратно.

Если вам не трудно помогите пожалуйста. время сдачи подходит к концу а я почти все время (2/3) в больнице провалялся.
скиньте, что сможите на мыло:strogove@bk.ru
Убедительная просьба подписывать тему по содержанию.

Зарание благодарен. Евгений.

Автор: LSD 30.11.2005, 14:11
Цитата
3.Написано приложенние на Java по переводу из 10ой во 2ую и16ую системы и обратно.

Этот код переводит из произвольной системы счисления (поддерживаются 2-36 ричные системы), в любую другую.
Код
public String convertTo(String number, int from, int to)
{
  int result = Integer.parseInt(number, from);
  return Integer.toString(result, to);
}


Все остальное ищи на сайтах с рефератами.

Автор: Гость_Евгений 1.12.2005, 12:21
Подскажите пожалуйста как переводить дробные числа.
Заранее благодарен.

Автор: LSD 1.12.2005, 14:21
Цитата
Подскажите пожалуйста как переводить дробные числа.

Любое рациональное число можно представить в виде дроби M/N где M и N целые, а конвертировать целые известно как. Вопрос только в том как его так так представить, можно потребовать от пользователя вводить в таком виде (самый простой вариант), или самому заниматься преобразованием тут уж надо смотреть в каком виде оно может быть введено.

Автор: Гость_Дмитрий 1.12.2005, 17:14
Дело в том, что Integer.toString(a, b) требует чтобы и а, и b были целочисленные.
а при делении у нас иногда будут получаться дробные smile
Подскажите, пожалуйста, как быть?

Автор: LSD 1.12.2005, 17:22
Код
  private static String convert(String number, int from, int to)
  {
    String result = "";
    int i = Integer.parseInt(number.substring(0, number.indexOf('/')), from);
    result += Integer.toString(i, to) + "/";
    i = Integer.parseInt(number.substring(number.lastIndexOf('/') + 1), from);
    result += Integer.toString(i, to);
    return result;
  }

  public static void main(String[] args)
  {
    System.out.println("123/345 = " + convert("123/345", 10, 16));
    System.out.println("123/345 = " + convert("123/345", 10, 2));
    System.out.println("ABC/F05 = " + convert("ABC/F05", 16, 10));
  }

Получим:
Код
123/345 = 7b/159
123/345 = 1111011/101011001
ABC/F05 = 2748/3845

Автор: Евгений(псевдоним Дмитрий) 1.12.2005, 18:09
LSD, большое СПАСИБО smile smile

Автор: Гость_Евгений 1.12.2005, 18:46
LSD, Это снова я smile
препод потребовал, чтобы выводился дробный результат в системе исчисления в которую переводим smile
Подскажи пожалуйста. как так сделать.
Заранее спасибо.

Автор: LSD 1.12.2005, 21:48
Цитата
препод потребовал, чтобы выводился дробный результат в системе исчисления в которую переводим

Кто скажет что 1111011/101011001 не дробь пусть первый бросит в меня камень smile
Не понимаю в чем проблема?

Автор: NextAlex 1.12.2005, 22:14
Цитата(LSD @ 1.12.2005, 21:48)
Кто скажет что 1111011/101011001 не дробь пусть первый бросит в меня камень

Полностью согласен с LSD.
Преподу явно нечем заняться.
Хотя по теории в любой системе счисления можно представить результат деления двух чисел как целая и дробная части через точку, но насколько я знаю такие вычисления не предусмотрены ниодним компилятором и делать это придется вручную ... правда задача эта довольно неприятная ...
Сейчас попытаюсь вспомнить чему нас учили 6 лет назад smile. Получится - брошу сюда.

Автор: LSD 1.12.2005, 22:24
Цитата(NextAlex @ 1.12.2005, 22:14)
Хотя по теории в любой системе счисления можно представить результат деления двух чисел как целая и дробная части через точку

А, точно!

Цитата(NextAlex @ 1.12.2005, 22:14)
но насколько я знаю такие вычисления не предусмотрены ниодним компилятором и делать это придется вручную

Ну, как я понимаю, именно в этом и смысл был. Просто его не устроило что задача была так просто решена, а студент должен показать собственную работу мысли (ну или с имитировать ее smile ).

Автор: NextAlex 2.12.2005, 00:06
У меня получилось так:
Код

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println("HEX   101F/35 = " + m.toAnySystem("101F","35", 16, 5));
        System.out.println("HEX   1F/45A = " + m.toAnySystem("1F","45A", 16, 5));
        System.out.println("OCT   754/62 = " + m.toAnySystem("754","62", 8, 5));
        System.out.println("OCT   54/2573 = " + m.toAnySystem("54","2573", 8, 5));
        System.out.println("DEC   335/85 = " + m.toAnySystem("335","85", 10, 5));
        System.out.println("DEC   25/367 = " + m.toAnySystem("25","367", 10, 5));
        System.out.println("BIN   1010010001/1101 = " + m.toAnySystem("1010010001","1101", 2, 10));
        System.out.println("BIN   10100/111000101 = " + m.toAnySystem("10100","111000101", 2, 10));
    }
    
    String toAnySystem(String chislitel, String znamenatel, int system, int Prec/*точность*/){
        String result = "";
        long a = Integer.parseInt(chislitel, system);
        long b = Integer.parseInt(znamenatel, system);
            boolean bFinished = false;
            boolean bPot = false;
            long _res = 0;
            int count = 0;

            while (!bFinished){
                if (a < b){
                    result += "0";
                    a *= system;
                    if (!bPot){
                        result += ".";
                        bPot = true;
                    }
                }else{
                    if (a == b){
                        result += "1";
                        bFinished = true;
                    }else{
                        _res = Math.round(Math.floor((a)/(b)));
                        result += Long.toString(_res, system);
                        a = (a - (_res*b))*system;
                            if (!bPot && (a != 0)){
                                result += ".";
                                bPot = true;
                            }
                    }
                }
                
                if (bPot){
                    if (count >= Prec){
                        bFinished = true;
                    }
                count++;
                }
                if (a == 0){
                    bFinished = true;
                }
            }
        
        return result;
    }

Как ни странно, работает ... smile
Код

C:\IProgects\Convert\dist>java -jar Convert.jar
HEX   101F/35 = 4d.de304
HEX   1F/45A = 0.071fb
OCT   754/62 = 11.65605
OCT   54/2573 = 0.02003
DEC   335/85 = 3.94117
DEC   25/367 = 0.06811
BIN   1010010001/1101 = 110010.1000100111
BIN   10100/111000101 = 0.0000101101

Единственное, думаю это можно немного оптимизировать и привести в божеский вид ...
Если уж преподу и этого мало будет, тогда просто застрелись smile ...

Автор: Гость_Евгений 2.12.2005, 06:39
Народ, благодарен. smile
Но еще вопросик- что такое +=

Автор: batigoal 2.12.2005, 09:18
x += y;
эквивалентно
x = x + y;

Автор: LSD 2.12.2005, 10:42
У меня немного другой вариант:
Код
public class NumericalSystem
{
  private static int integer, fractional, fractionalDegree;

  public static String convert(String number, int from, int to)
  {
    parse(number, from);
    String i = Integer.toString(integer, to);
    String f = convertFractional(((double) fractional) / ((double) fractionalDegree), to);
    return i + '.' + f;
  }

  private static String convertFractional(double fractional, int radix)
  {
    String result = "";
    while(fractional > 0.0)
    {
      fractional *= radix;
      int digit = (int) fractional;
      result += Character.forDigit(digit, radix);
      fractional -= digit;
    }
    return result;
  }

  private static void parse(String number, int from)
  {
    String i = number.substring(0, number.indexOf('.'));
    String f = number.substring(number.indexOf('.') + 1);
    integer = Integer.parseInt(i, from);
    fractional = Integer.parseInt(f, from);
    fractionalDegree = from;
    while(fractionalDegree < fractional)
      fractionalDegree *= from;
  }

  public static void main(String[] args)
  {
    System.out.println(convert("123.12", 10, 2));
    System.out.println(convert("123.12", 10, 16));
  }
}

в итоге имеем:
Код
1111011.00011110101110000101000111101011100001010001111010111
7b.1eb851eb851eb8

Автор: Гость_Евгений 3.12.2005, 10:18
smile Народ подскажите мне,пожалуйста, такому неразумному, где можно найти реферат на эту тему:
"позиционные системы исчисления "
1.Должны быть описанны 2,8,16-ричные системы исчисления.
2.Описанно представление в памяти примитивных данных.
3.Написано приложенние на Java по переводу из 10ой во 2ую и16ую системы и обратно.
укажите пожалуйста ссылки, а то я нифига искать в нете пока не умею smile

Автор: Гость_Евгений 3.12.2005, 10:20
ой, Ошибочка, 3его не надо smile уже подсказали smile

Автор: Гость_Евгений 4.12.2005, 08:18
И еще вопросик: какая функция у Integer.parseInt(String a, int b) ?
напишите пожалуйста скорее, время сдачи работ подходит к концу, а препод будет спрашивать что обозначает каждое действие. Я все понял кроме этого.
Заранее спасибо.Евгений.

Автор: batigoal 4.12.2005, 10:43
Перевод строки в десятичное число.
a - строка в любой системе счисления
b - основание этой системы счисления

Например, Integer.parseInt("100", 2) = 4

Автор: Гость_Евгений 4.12.2005, 12:45
народ подскажите, пожалуйста, все-таки ссылки на реферат(тему см. выше), а то где ни пытался найти данные на реферат нигде нет. Наверно фигово умею искать smile
Плз подскажите, а то блин как я дз здам без основной части(реферата).
Препод злой smile , блин, убьет нафиг. smile

Автор: LSD 4.12.2005, 12:57
Я вбил в Яндек рефераты, перешел по первой ссылке вбил там в поиск системы счисления и получил два реферата на заданную тему, с описанием систем счисления, переводом чисел и рассмотрением дробных чисел.

Автор: batigoal 4.12.2005, 13:28
Гость_Евгений
Поимей совесть, это форум прграммистов, а не центр написания рефератов. Таких сайтов полно. http://www.bankreferatov.ru/, например. Там предостаточно данных по этой теме.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)