С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71

Как правильно унаследовать класс?

16.12.2014, 16:32. Показов 1698. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс для работы с большими целыми знаковыми числами.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
public class BigNum 
{
    static int base = 100;
    static int LenNum=3000;
    int num[];
    
    //Конструкторы
    //выделение памяти
    BigNum() {
        num = new int [LenNum];
    }
    //перевод числа в base-ичную систему
    BigNum(int x) {
        this();
        int i=LenNum-1;
        while (x>0)
        {
            num[i]=x%base;
            x/=base;
            i--;            
        }
    }
    //конструктор копирования
    BigNum(BigNum x) {
        this();
        int i=LenNum;
        while (i>=0) {
            num[i]=x.num[i];
            i--;
        }
    }
    //Функция копирования 
    void copy (BigNum x) {
        for (int i = 0; i<LenNum; i++)
            num[i]=x.num[i];
    }
    
    //функция сложения
    void add(BigNum x) {
        int ost=0;
        int i=LenNum-1;
        for (;i>=0; i--) {
            num[i]+=x.num[i]+ost;
            ost=num[i]/base;
            num[i]%=base;
        }
        
    }
    
    //функция для сравнения чисел
    public boolean a_b(BigNum x) {
        int i=0;
 
        while (i<LenNum && num[i]==x.num[i])
            i++;
 
        if (i==LenNum || num[i]>=x.num[i])
            return false;
        else
            return true;
        }
 
    
    //вычитание
    void sub(BigNum x) {
        int ost=0;
        for (int i=LenNum-1; i>=0; i--) {
            num[i]=(num[i] - x.num[i]+ost);
            if (num[i]<0) 
            {
                ost=-1;
                num[i]+=base;
            }
            else
                ost=0;
        }
    }
    
    //Функция умножения
    void mul(BigNum x) {
        BigNum rez=new BigNum();
        int i, j=LenNum-1;
        int lim_j=0, lim_i=0;
        int y; int ost;
        while (x.num[j]<=0)//находим нули для пропуска
            j--;
        while (x.num[lim_j]==0)//находим начало числа
            lim_j++;
        while (num[lim_i]==0)
            lim_i++;
        //начинаем с числа после нулей, до начала числа соответственно
        for (; j>=lim_j; j--) {
            y=j; ost=0;
            BigNum mas =new BigNum();
            //с конца второго числа до его начала
            for (i=LenNum-1; i>=lim_i; i--) {
                mas.num[y]=num[i]*x.num[j]+ost;//умножаем числа в заданных местах
                ost=mas.num[y]/base;//если остаток больше С.С. переводим его в нашу С.С.
                mas.num[y]%=base;
                y--;
            }
            //Добавление остатка в следующие ячейки, при его наличии
            while (ost>0) {             
                mas.num[y]=ost%base;
                ost/=base;
                y--;
            }           
            rez.add(mas);           
        }       
        this.copy(rez);     
    }
    
    //Деление целочисленное
    void div(BigNum x) {
        BigNum rez = new BigNum(); //результат 
        BigNum one = new BigNum(1); //
        while (!(this.a_b(x))) //пока первое число не станет меньше второго
        {
            this.sub(x); //отнимаем
            rez.add(one); //прибавляем для результата
        }
        x.copy(this);
        this.copy(rez); //копируем в num
    }
    // Печать числа строкой
    static void pr(BigNum x) {
        System.out.println(x.inString());
    }
    //перевод массива в строку
    public String inString() {
        int i=0;
        String str = "";
        while (num[i]==0)
            i++;
        for (; i<LenNum; i++){
            str+=num[i];
            str+='`';
        }
        return str;
    }
}
создать подкласс для работы с большими числами с плавающей точкой.
Пытался унаследовать его и заменить некоторые методы но глухо, не знаю что уже сделать
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2014, 16:32
Ответы с готовыми решениями:

Как унаследовать класс, изменив пару полей
Собственно задача. Хочу создать свой класс унаследованній от другого(JLabel). Мне это нужно для того, что бы во всех экземпляра...

Как правильно называется класс хранящий данные для ArrayList
Есть ArrayList в нем элементы типа MyClass. MyClass предназначен для хранения данных, в нем 2 поля. Как такой класс правильно называют?

Как правильно работать с GUI , класс main и класс окна
Здравствуйте , вот только не давно начал работать с пользовательским интерфейсом. Сейчас пытаюсь сделать программу , работаю в NetBeans....

12
 Аватар для YuraAAA
1605 / 1337 / 291
Регистрация: 25.10.2009
Сообщений: 3,487
Записей в блоге: 2
16.12.2014, 16:37
factura122, а что именно не получилось? Видимо не хватает public перед void =)
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
16.12.2014, 16:40
Наследование числа с плавающей точкой от целого противоречит здравому смыслу...
0
 Аватар для KillSwitch
332 / 38 / 15
Регистрация: 12.12.2014
Сообщений: 176
16.12.2014, 16:41
Делаете очень просто:
Java
1
2
3
public class BigFloat extends BigNum {
// переопределяете методы
}
Получите потомка BigFloat , обладающего всеми теми же полями, что и BigNum.
Пришлите код потомка, что именно не получается?
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71
16.12.2014, 16:47  [ТС]
Появлялась следующая ошибка
Java
1
java.lang.ArrayIndexOutOfBoundsException
Насколько понял переполнение массива

Добавлено через 5 минут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class FNum extends BigNum
{
    float array[]
    int Len=3000;
    boolean sign;
    UnNum()
    {
        array=new double[Len];
    }
    UnNum (float x)
    {
      if (x<0) 
          sign = false;
      else sign = true;     
      if (!sign) 
          x *= -1;          
    }
}
С горя удалил большую часть
0
 Аватар для KillSwitch
332 / 38 / 15
Регистрация: 12.12.2014
Сообщений: 176
16.12.2014, 16:53
Цитата Сообщение от factura122 Посмотреть сообщение
следующая ошибка
Покажите весь код потомка, такая ошибка обычно проявляется, когда вы пытаетесь обратиться к ячейке за пределами массива.

Добавлено через 4 минуты
У вас 2 конструктора, а инициализация массива только в одном. Если не хотите дублировать код, поместите во второй конструктор вызов первого.
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71
16.12.2014, 16:59  [ТС]
А вообще метод super() может помочь?
0
 Аватар для KillSwitch
332 / 38 / 15
Регистрация: 12.12.2014
Сообщений: 176
16.12.2014, 17:01
В данном случае нет, у вас инициализация массивов разных типов. В предке int num[]; а в потомке float array[];
0
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71
16.12.2014, 17:34  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static void pr(FNum x) {
        System.out.println(x.inString());
    }
    //перевод массива в строку
    public String inString() {
        int i=0;
        String str = "";
        while (array[i]==0)
            i++;
        for (; i<Len; i++){
            str+=array[i];
            str+='`';
        }
        return str;
    }
Когда пытаюсь вывести значение из экземпляра
Java
1
2
FNum F=new FNum(500);
      System.out.printf("Первое число - %s\n", F.inString());
Появляется ошибка
Java
1
java.lang.ArrayIndexOutOfBoundsException
Добавлено через 1 минуту
Error тут
Java
1
while (array[i]==0)
Добавлено через 6 минут
Спасибо, добавление инициализации в метод не помогает

Добавлено через 5 минут
Тем не менее, таково задание
0
 Аватар для KillSwitch
332 / 38 / 15
Регистрация: 12.12.2014
Сообщений: 176
16.12.2014, 18:51
Лучший ответ Сообщение было отмечено factura122 как решение

Решение

Цитата Сообщение от factura122 Посмотреть сообщение
FNum F=new FNum(500);
по умолчанию компилятор понимает аргумент 500 как int значение, соответственно вызывается родительский конструктор BigNum(int x), и инициализируется родительский массив. Чтобы вызвать конструктор потомка, нужно передать аргумент типа float, так как у вас UnNum (float x). Для этого достаточно добавить литерал "f" в конце числа:
Java
1
FNum F=new FNum(500f);
Или использовать явное приведение типов:
Java
1
FNum F=new FNum((float) 500);
1
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71
17.12.2014, 08:38  [ТС]
Cпасибо,помогло)
Есть еще задание создать класс для работы с беззнаковыми числами, сок момента в том что беззнаковых типов нет,может какие то ухищрения есть?
0
 Аватар для KillSwitch
332 / 38 / 15
Регистрация: 12.12.2014
Сообщений: 176
17.12.2014, 08:44
Math.abs(n) — возвращает модуль числа n. Либо можно попробовать побитовый сдвиг влево, затем вправо, так как первый бит отвечает за знак числа. Не совсем понял что должно получиться в итоге. Кроме того тип char беззнаковый.
1
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 71
18.12.2014, 14:32  [ТС]
Все разобрался, под беззнаковым имелось в виду положительное число
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2014, 14:32
Помогаю со студенческими работами здесь

Как правильно замапить класс в Hibernate
есть класс &quot;кролики&quot; у него есть name. Есть своя табличка с данными. name String и соответственно Varchar в SQL есть класс...

Как в NetBeans отобразить методы которые можно унаследовать?
В InteliJ IDEA для этого есть сочетание клавиш Ctrl+O а что в NetBeans? Добавлено через 2 минуты Что такое в чем дело почему я могу...

Наследование классов С++ (не могу правильно унаследовать базовый класс)
Здравствуйте, вот хочу разобраться как правильно унаследовать класс. Задача такова, унаследовать ранее написанный мною класс, добавив в...

Как правильно унаследовать TPoint2D от TPoint3D/ Правильно ли наследовать? ООП
Два пользовательских класса: Точка в 2D пространстве и точка в 3D пространстве. class TPoint3D{ int X,Y,Z; public: ...

Как правильно унаследовать ostream, istream ?
Ну вообщем цель такова, чтобы в функцию можно было передать либо обьект моего класса, либо же cout , cin. MyStream mout = MyStream(); ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru