|
Вопрос # 165/ вопрос открыт / |
|
Здравствуйте, хотел бы узнать вот что: Какой метод должен быть в программе, чтобы часы выводили на экран текущее астрономическое время? Опишите пожалуйста этот метод. И ещё: как проверить чётность числа? If x mod 2=0 Then... это понятно, а второй способ?
 |
Вопрос задал: Полушин Сергей Анатольевич (статус: Посетитель)
Вопрос отправлен: 19 ноября 2006, 12:50
Состояние вопроса: открыт, ответов: 5.
|
Ответ #1. Отвечает эксперт: Dron
Здравствуйте, Полушин Сергей Анатольевич!
Честно говоря, не понял, с чего Вы взяли, что способов проверки чётности числа всего 2... Ну раз 2, значит 2 :-) Первый, как Вы верно указали - проверять остаток от деления с помощью mod, а второй, более удобный - использование готовой функции... Однако стандартная функция проверяет не чётность числа, а его нечётность. Это функция Odd. Вот пример:
If not(Odd(x)) Then {число чётно}
Удачи!
 |
Ответ отправил: Dron (статус: Студент)
Время отправки: 19 ноября 2006, 16:22
Оценка за ответ: 4
|
Ответ #2. Отвечает эксперт: Косолапов Дмитрий Юрьевич
Не совсем понятно, что значит "текущее астрономическое время", но узнать системное время можно, используя функцию Time...
Ответ #3. Отвечает эксперт: Новаковский Юрий Аврамович
Здравствуйте, Полушин Сергей Анатольевич!
Если Вам действительно нужно текущее астрономическое время, см. здесь:
http://www.intuit.ru/department/se/pposix/12/pposix_12.html на Си, но лучше чем ничего.
Удачи Вам!
Ответ #4. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Полушин Сергей Анатольевич!
Добавлю только пару слов о Odd. Это суперфункция, т.е. например, если указать ей константное значение оно будет вычислено на этапе компиляции, а потом просто возвращено. И еще, это быстрая функция, она использует флаг P контроля четности, выставляемый командой ADD.
Ответ #5. Отвечает эксперт: Alexander A. Gribanov
Самый универсальный вариант безотносительно языка программирования - если чесло чётное, то младший бит числа равен 0, если не чётное - 1.
Следовательно в Delphi это может выглядеть так:
if (i and 1)=0 then ... // число чётное
 |
Ответ отправил: Alexander A. Gribanov (статус: 2-ой класс)
Время отправки: 21 ноября 2006, 09:43
Оценка за ответ: 2
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 10 марта 2007, 19:31; участников в обсуждении: 2.
|
mvp (статус: 4-ый класс), 20 ноября 2006, 20:56 [#1]:
По чётным можно ещё и if x and 1 = 0 then {чётное}
|
|
Dron (статус: Студент), 20 ноября 2006, 21:48 [#2]:
mvp: Честно говоря, сколько времени уже работаю с Delphi, но вот с подобными вещами не сталкивался... Не могли бы объяснить, что значит условие x and 1, а то очень интересно?..
С уважением.
|
|
Dron (статус: Студент), 21 ноября 2006, 11:53 [#3]:
Благодаря ответу Alexander A. Gribanov всё стало ясно
С уважением.
|
|
mvp (статус: 4-ый класс), 21 ноября 2006, 13:42 [#4]:
Написал такой трактат, и тут почта пришла, что уже всё ясно Ладно, тогда вкратце - логическое "И" (and) можно использовать, чтобы определить чему равен какой-то бит или чтобы занулить определённые биты. Например, легко перевести латинский маленький символ в большой: x and $df даст большой символ (если он был большим, то таким и останется). Просто отличие в ASCII-кодах между маленькими и большими буквами равно 32, вот и зануляем соответствующий бит. Возможно, и с русскими будет работать.
Логическое "ИЛИ" (or) может служить для установления в 1 некоторых битов. Например, из большой буквы делаем маленькую: x or $20. Или получить ASCII код цифры: i or $30 (эквивалент ORD("i"), где вместо i можно подставить 0,1,2..9.
А ещё мне нравится использовать побитовые сдвиги: вправо (shr) и влево (shl). С помощью их реализуется "быстрое" деление и умножение на степени 2. x shl n эквивалентно x * (2^n), а x shr n эквивалентно x div (2^n) - деление нацело.
Ещё можно составить например integer из байтов:
var x1, x2, x3, x4: byte;
i : integer;
//---
i = x1 + x2 shl 8 + x3 shl 16 + x4 shl 24
Или выделить старший байт из integer:
b = i shr 24...
|
|
mvp (статус: 4-ый класс), 21 ноября 2006, 13:47 [#5]:
А в общем, использование логических операций должно ускорять работу программы (хотя с современной техникой это не важно), т. к. их эквиваленты выражаются одной процессорной командой, а использвание стандартных функций LowerCase, UpperCase, Ord, возведение в степень и т. д. - это ещё огромная подготовительная работа со стеком (поместить параметры в стек, добавить точку возврата, перейти, посчитать, возвратиться, очистить стек), т. е. экономия явная, но на современном компьютере она не заметна (во всяком случае в подавляющем большинстве задач).
|
|
Dron (статус: Студент), 21 ноября 2006, 15:44 [#6]:
mvp: спасибо за такую обширную информацию Тема очень интересная. Думаю, всем пойдёт на пользу.
С уважением.
|
|
mvp (статус: 4-ый класс), 10 марта 2007, 19:31 [#7]:
Вот рассылка вышла и вспомнилось.
Для перевода в нижний регистр(в строке могут быть и цифры, а также другие знаки, которые не затронутся):
for(int _= 0; str1[_] != 0; ++_) str1[_] |= ((str1[_] - 1) >> 1) & 32;
Для перевода в верхний регистр:
for(int _= 0; str1[_] != 0; ++_)str1[_] &= (str1[_] & (str1[_] >> 1) & 32) ^ 255;
Перевести на паскаль - особых проблем не должно вызвать. Тут учтены артефакты с не буквами
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|