![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Kernigan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Уважаемые участники форума
Здесь представлена программа, преобразующая двоичное число в десятичное. Программа работоспособная, компилировалась в KDeveloper, но далека от совершенства. Помогите, пожалуйста, довести её до "ума", с использованием инструментов C++. Буду очень благодарен.
|
|||
|
||||
| MAKCim |
|
||||||||||||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 6 Всего: 207 |
зачем привязка класса к потокам стандартной библиотеки?
зачем виртуальный деструктор? зачем #define?
по стандарту при невозможности выделения памяти генерируется bad_alloc так что лучше перехватывать (если нужно) исключение
с точки зрения оптимизации лучше в цикле strlen не вызывать
проверка лишняя (опять оптимизация), применение delete к нулевому указателю - не ошибка по стандарту!
выход за диапозон (индексация с 0) + ошибка компиляции (преобразование из int в char). Вообще что ты этим хотел сказать? наверное так
Это сообщение отредактировал(а) MAKCim - 25.6.2006, 15:56 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||||||||||||
|
|||||||||||||||||||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Вот-так работает, вроде без ошибок.
Это сообщение отредактировал(а) Олег4 - 26.6.2006, 05:55 |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
здесь в методе класса используется глобальная переменная. ее надо занести в класс и инициализировать в конструкторе. то есть в конструкторе Это сообщение отредактировал(а) Rockie - 26.6.2006, 10:53 -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Rockie |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 23.4.2006 Репутация: 13 Всего: 31 |
да и вообще, такая конструкция
выглядит нелогично. то есть указывается но в то же время память выделяется под 17 элементов. функции лучше писать с большой буквы, но это опять же стиль. -------------------- Чтобы иметь большой гардероб - надо иметь большой гардероб. |
|||
|
||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Rokie, я сам пытаюсь отвечать на вопросы ради тренировки, сам ещё недавно начал учить С++. А то, что глобальная перем. num должна быть в нутри класса, это вроде правильно, а то что p = new char [num+1]; выделяет 17 элементов это я для символа '\0' (конец строки) зарезервировал, хотя смотрю сейчас на программу, вижу что этого ненадо. Если только надо-будет вывести число в двоичном формате, как его ввели, тогда нужна строка завершонная '\0', ведь 16 символов для десятичного числа int16(в dos) как я понял.
Вот переделал, работает с 30 разрядами, почему-то с 32 разрядами long не пашет. Чтоб проблем небыло работает не с char а со, string
|
|||
|
||||
| Kernigan |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Хорошее решение, сам бы не догадался. В функции
очевидно, следует добавить обработку на нажатие клавишь от 2 до 9, а также, выход за 30 разрядов. А деструктор, я так полагаю, здесь неуместен или его можно включить? |
||||
|
|||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Память оператором new невыделяем, и delete ненадо, а без delete деструктор необязателен. Вот выдумал как с ошибками работать.
|
||||
|
|||||
| Kernigan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Реализация этого класса очень понравилась. Спасибо. Обработка ошибок реализована удачно. Лучше не придумаешь.
По аналогии этого класса попытался сделась другой, переводящий из дясятичных в двоичные: вот что получилось.
|
|||
|
||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Можно-было сообразить один класс конвертации из десятич. в двоичную и обратно.
|
|||
|
||||
| Kernigan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Здравствуй Олег
Выбор такого способа реализации операций из 2 -> 10 и наоборот, не случаен. Таким образом я хочу реализовать механизм наследования. Эти два класса будут потомками класса, который, также, будет реализовывать другие мат. операции. Согласен, что проще было бы создать
и много ещё чего придумать в нём, но кто после этого будет, к примеру, разбираться в этом коде и уж тем более сопровождать его. Как мне кажется, с точки зрения стилистики С++, такой код будет нечитабельным. По крайней мере, так меня учили SoftWare Designer'ы |
|||
|
||||
| Oleg_Ci |
|
||||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Кстати, есть библиотечные функции для преоброзования десятичных чисел в любые с основанием от 2 до 32, т.е. двоичные, третичные и т.д...
В книге написано что itoa работает с int16, а программа с long пашет. Про библиотечные функции перевода двоичных чисел в десятичные не слышал.
Кстати, чтоб class CBinaryNumbers возвращал 32 бит десятич число то функции тоже объяви unsigned long а не просто long, а если 64 разряда надо то unsigned long long или unsignt __int64. |
||||
|
|||||
| Kernigan |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
Твою версию класса я изменять не собираюсь. В этом варианте меня устраивает всё. И на базе этого его я реализую то, что показал ранее, перевод из 10->2 . Что касается Softwsre Designer и Software Developer Это программисты( с солидным опытом), пишущие код на С++, они-то и дали несколько рекомендаций о том, что не следует загружать класс лишними функциями. Это. как они считают, усложняет сопровождение кода и его читабельность. |
|||
|
||||
| Kernigan |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 18.6.2006 Репутация: нет Всего: нет |
При компиляции получил сообщение о том, что не найден прототип функции itoa и _i64toa, не определена константа _UI64_MAX . В библиотеке #include <limits.h> есть константа максимального значения unsigned int UINT_MAX. Компилировал этот код в KDevelop. Переделал вышепреставленный код преобразования из 10->2 систему. Перевод осуществляется, но не получается обработать ошибку нажатия символа в десятичном числе.
|
||||
|
|||||
| Oleg_Ci |
|
|||
![]() Friend ![]() ![]() Профиль Группа: Участник Сообщений: 485 Регистрация: 28.5.2006 Где: Новосиб.обл. Репутация: 25 Всего: 30 |
Это снова я, если запоздал, то потому-что модем сломался.
Почему у тебя функции не идут, то я точно незнаю, я пришу программы на Borland C++ builder 6. И что такое KDevelop тоже непредставляю, не видел никогда. Вобщем сочинил класс для перевода чисел из двоич. в десятич. и обратно, не так как тебе надо, но я уже это для себя старался(ради спортивного интереса). Если что неправильно, то я не специалист вообще-то...
|
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |