Вопрос № 52712: Доброго времени суток, неделю пытаюсь решить задачу из книги Дейтелов "Как программировать на С".
Сама задача:
Выведите таблицу, состоящую из десятичного, двоичного, восьмеричного и шестнадцатиричного эквивалентов. Если вы не знак...Вопрос № 52760: Здравствуйте!
Я хочу написать программу на С++ Builder5 для работы в сети.
Не подскажете, как это сделать?...Вопрос № 52784: Я пишу MDI приложения. В приложении будет панел инструментов на базе шаблона диалогового окна. На этой панели инструментов будут ряд Control-элементов, некоторые из которых желательно сделать недоступные, когда не открыт ни один инструмент. Для этого...
Вопрос № 52.712
Доброго времени суток, неделю пытаюсь решить задачу из книги Дейтелов "Как программировать на С".
Сама задача:
Выведите таблицу, состоящую из десятичного, двоичного, восьмеричного и шестнадцатиричного эквивалентов. Если вы не знакомы с этими системами счисления, но хотите попытаться выполнить это упражнение, сначала прочитайте приложение В.
Что по поводу преобразования этих чисел в приложение В:
Предположим, что мы хотим преобразовать 10-е число 57 в двоичное. Начнем с того, что выпишем значения позиций двоичной системы в колонки, справа налево, пока не дойдем до позиционного значения, превосходящего наше десятичное число. Эта позиция нам не нужна и мы отбрасываем этот столбец. Таким образом, сначала мы запишем:
Позиционные значения: 64 32 16 8 4 2 1
Затем мы отбрасываем столбец с позиционным значением 64
Позиционные значения: 32 16 8 4 2 1
После этого начинается процесс обработки столбцов, с крайнего левого столбца и далее, до крайнего правого. Мы делим 57 на 32, получаем 1 и остаток 25 и т.д.
В результате получаем:
Позиционные значения: 32 16 8 4 2 1
Значения цифр: 1 1 1 0 0 1.
Я конечно понимаю, что уровень у меня никакой, но стараюсь. Вот что до этого изучено по этой книге:
Циклы, переменные инт и флоат и все. Т.е. не о каких указатаелях, строках, массивах и т.п. не упоминалось еще.
Ну а вот сам код, который у меня получился для 2-х, а вот для остальных никак.
# include <stdio.h>
int main ()
{
int t_zn = 1, k, j = 0, i = 1, temp ;
for (k = 0; k <= 16; k++)
{
t_zn = k;
if (t_zn == 0)
{
printf ("%11s%10s
", "Десятичное число", "2 -ое число");
printf ("%11d%14d
", k, t_zn);
}
else
{
temp = t_zn;/*Для расчета остатка от деления для 2-х чисел*/
i = 1;
while (i <= t_zn)/* Вычисление позиционных */
{
i *= 2; /* значений, кот. не м.б. > введенного числа для 2-х*/
}
j = i;
j /= 2;
printf ("%11d ", k);
while (j > 0)
{
t_zn /= j; /*Результат показывает целочисленное деление для 2-х*/
temp %= j; /*Результат показывает остаток от деления для 2-х*/
printf ("%d", t_zn);/*Печать результата целочисленного деления*/
t_zn = temp;
j /= 2;
}
printf ("
");
}
}
return 0;
Просьба, подскажите, как добавить например еще для 8-х. Если по-порядку, т.е. вывести сначала для 2-х, затем для 8-х, и для 16-х. То, в принципе ничего сложного. А вот как вывести это в одной таблице, т.е. 10-е, 2-е, 8-е, 16-е - вот над этим уже неделю бьюсь. Хотя в условии не сказано что надо именно так, но думаю имеется ввиду именно это. Подскажите, у кого есть мысли на этот счет. С самого кода прошу громко не смеяться, начинающий я.
Отправлен: 21.08.2006, 00:23
Вопрос задал: Grekalov (статус: Посетитель)
Всего ответов: 4 Мини-форум вопроса >>> (сообщений: 3)
Отвечает: Сухомлин Кирилл Владимирович
Здравствуйте, Grekalov!
Все очень просто. Чтобы не путаться в каких-то постоянных величинах, объявляйте их в начале программы и меняйти работу программы только через них. Если вы один раз так сделаете, то, во-первых, в дальнейшем вам будет проще. А если это просто числа, раскиданные по телу программы, то - где-дь да забудете поменять.
В приложении ваш же код, но чуть-чуть измененный. Можете сами внести изменения: все цифры "2" в коде заменить на константу (у меня это BCS, Base of Calculation System). Лучше, конечно, давать более понятные имена константам и переменным.
Пробовал тот же код, но со значениями константы 4, 10, 16 - работает именно так, как должно.
ЗЫ: Надо "проще" подходить к написанию программ =)
Эта процедура должна корректно преобразовывать числа к системе счисления с основаниями от 2 до 36.
Вызываем для двоичной системы счисления
digit(57, 1);
Должно быть напечатано число в двоичной системе.
Для 8-ричной:
digit(57, 8);
Должно быть напечатано число в восьмеричной системе и т.д.
Если не будет получаться или возникнут вопросы - пиши по внутренней почте.
Ответ отправил: Www2 (статус: 5-ый класс)
Ответ отправлен: 21.08.2006, 07:44
Отвечает: Zitz
Здравствуйте, Grekalov!
Ну я думаю эту задачу человек не знакомый ни со строками, ни с функциями, ни с рекурсией, ни с массивами, ни с кейсами, ни с указателями, ни с константами
должен решить примерно так (см. приложение)
З.Ы. У меня выводится ввиде нормальной таблицы... Как я понимаю основная проблема была с этим? Выводил с помощью обычной табуляции.
Приложение:
--------- Успех неизбежен + Думать вообще полезно + Чем сейчас, тем лучше
Ответ отправил: Zitz (статус: Студент)
Ответ отправлен: 21.08.2006, 14:02
Отвечает: Ross
Здравствуйте, Grekalov!
Есть другой способ перевода в двоичную систему - последовательное деление на 2 (на мой взгляд он проще). Допустим нужно перевести число 5 в двоичную систему:
1) делим 5 нацело на 2 -> получаем 2.
2) вычисляем остаток от деления -> получаем 1.
3) повторяем для числа 2 -> получаем 1 и 0 в остатке.
4) число 1 - само по себе - остаток от его деления на 2.
5) записываем полученные остатки от деления справа - налево: получилось 101.
Аналогично для восьмеричной и шестнадцатеричной систем. Исходный код программы, реализующей вашу задачу, привожу в приложении. Только советую прежде прочитать про массивы и указатели, т.к. она их использует. Удачи!
Приложение:
Ответ отправил: Ross (статус: 1-ый класс)
Ответ отправлен: 21.08.2006, 14:26
Вопрос № 52.760
Здравствуйте!
Я хочу написать программу на С++ Builder5 для работы в сети.
Не подскажете, как это сделать?
Отправлен: 21.08.2006, 16:32
Вопрос задала: Fanatka (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Mihasic
Здравствуйте, Fanatka!
Это зависит от того, что Вы хотите в сети делать.
Например, для общения программ по сети можно использовать сокеты (хотя есть много различных средств). Про сокеты (на уровне WinAPI) можно почитать тут: http://gamedev.ru/articles/?sect=8
Но это только начальный уровень, хотя и достаточный для написания большинства приложений.
Что придумали в билдере для работы с сокетами я не знаю, но сетевое приложение на WinAPI должно работать и компилироваться везде, независимо от подключенных библиотек (хотя етсь небольшие нюансы, но они понятны на уровне здравого смысла).
Ответ отправил: Mihasic (статус: 5-ый класс)
Ответ отправлен: 21.08.2006, 16:55 Оценка за ответ: 5
Отвечает: Vaga
Здравствуйте, Fanatka!
Интересно было бы узнать, как имено в сети эта программа будет реализована. Если подразумевается клиентская часть для удаленной СУБД (InterBase и т.п.) то можно использовать подходящие компоненты (тот же IBX для InterBase). Другой вариант - использование winsocket. Можно что - нибудь поискать здесь http://openlib.org.ua/index.php?go=450&pages=1.
--------- Вольному - воля
Ответ отправил: Vaga (статус: 1-ый класс)
Ответ отправлен: 21.08.2006, 17:34 Оценка за ответ: 5
Вопрос № 52.784
Я пишу MDI приложения. В приложении будет панел инструментов на базе шаблона диалогового окна. На этой панели инструментов будут ряд Control-элементов, некоторые из которых желательно сделать недоступные, когда не открыт ни один инструмент. Для этого обрабатываю сообщение WM_MDIACTIVE. Код обрабодчика приведен в приложении.
Но он работает весьма странно. Когда закрываю последний документ выводится окно с заголовком кнопки (см. Приложение). Пока это окно на экране, кнопка заблокирована, а как только я закрываю окно с заголовком кнопки, кнопка на панели инструментов становится доступной.
Поле CMainFrame::m_DlgToolBar имеет тип CDialogBar
Приложение:
Отправлен: 21.08.2006, 18:19
Вопрос задал: Melamed (статус: 3-ий класс)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: C4tnt
Здравствуйте, Melamed!
Привяжите кнопку не к MainFrame, а к ChildFrame или к CView. Код для OnMDIActivate писать не нужно - за вас это сделает MFC. Кстати он вам и мешает:
При создании/уничтожении окна MainFrame обновляет свое меню, проверяя доступность обработчика кнопки и включая её, если обработчик существует; причём это происходит после OnMDIActivate. Можете в этом убедится, изменив код так:
Если вам всё-таки нужно, чтобы кнопка была связана с Mainframe - можно поступить так же, как и разработчики MFC. Создаётся два шаблона менюшки и меняются по необходимости. Менять шаблоны лучше в MainFram`е, а вызывать функцию, которая меняет шаблоны - из OnMDIActivate.
--------- Теперь к нашим ответам осталось лишь найти вопросы
Ответ отправил: C4tnt (статус: 2-ой класс)
Ответ отправлен: 22.08.2006, 11:16 Оценка за ответ: 4 Комментарий оценки: Я уже решил эту проболему привезяв к кнеопке обрабодчик ON_UPDATE_COMMAND_UI(IDC_OTHERCOLOR,OnOtherColorUpdate) Вот
текст этого обрабодчика void CMainFrame::OnOtherColorUpdate(CCmdUI *pUI) { pUI->Enable((int)MDIGetActive()); } Но Вам за ответ все равно сп
072;сибо.