Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 506
от 27.08.2006, 00:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 366, Экспертов: 55
В номере:Вопросов: 3, Ответов: 7


Вопрос № 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 - работает именно так, как должно.

ЗЫ: Надо "проще" подходить к написанию программ =)

Приложение:

---------
Не узнаешь - не попробуешь.

Ответ отправил: Сухомлин Кирилл Владимирович (статус: Студент)
Ответ отправлен: 21.08.2006, 03:26

Отвечает: Www2
Здравствуйте, Grekalov!

Могу посоветовать рекурсивную процедуру, а то как-то всё у вас очень сложно :-)

void digit(int num, int base)
{
char nums[] ="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (num > 0)
{
digit(num / base, base);
putchar(nums[num % base]);
}
}

Эта процедура должна корректно преобразовывать числа к системе счисления с основаниями от 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. Можете в этом убедится, изменив код так:

...
if(pActivateWnd)
pWnd->EnableWindow(false);
else
...

Если вам всё-таки нужно, чтобы кнопка была связана с 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;сибо.


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.35 от 27.07.2006
Яндекс Rambler's Top100

В избранное