Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 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...

Ответ отправил: Косолапов Дмитрий Юрьевич (статус: 8-ой класс)
Время отправки: 19 ноября 2006, 18:28

Ответ #3. Отвечает эксперт: Новаковский Юрий Аврамович

Здравствуйте, Полушин Сергей Анатольевич!

Если Вам действительно нужно текущее астрономическое время, см. здесь:

http://www.intuit.ru/department/se/pposix/12/pposix_12.html на Си, но лучше чем ничего.
Удачи Вам!

Ответ отправил: Новаковский Юрий Аврамович (статус: 4-ый класс)
Время отправки: 20 ноября 2006, 12:16

Ответ #4. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Полушин Сергей Анатольевич!
Добавлю только пару слов о Odd. Это суперфункция, т.е. например, если указать ей константное значение оно будет вычислено на этапе компиляции, а потом просто возвращено. И еще, это быстрая функция, она использует флаг P контроля четности, выставляемый командой ADD.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 21 ноября 2006, 04:32
Оценка за ответ: 4

Ответ #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

mvp (статус: 4-ый класс), 20 ноября 2006, 20:56 [#1]:

По чётным можно ещё и if x and 1 = 0 then {чётное}
Dron

Dron (статус: Студент), 20 ноября 2006, 21:48 [#2]:

mvp: Честно говоря, сколько времени уже работаю с Delphi, но вот с подобными вещами не сталкивался... Не могли бы объяснить, что значит условие x and 1, а то очень интересно?.. :-)
С уважением.
Dron

Dron (статус: Студент), 21 ноября 2006, 11:53 [#3]:

Благодаря ответу Alexander A. Gribanov всё стало ясно :-)
С уважением.
mvp

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

mvp (статус: 4-ый класс), 21 ноября 2006, 13:47 [#5]:

А в общем, использование логических операций должно ускорять работу программы (хотя с современной техникой это не важно), т. к. их эквиваленты выражаются одной процессорной командой, а использвание стандартных функций LowerCase, UpperCase, Ord, возведение в степень и т. д. - это ещё огромная подготовительная работа со стеком (поместить параметры в стек, добавить точку возврата, перейти, посчитать, возвратиться, очистить стек), т. е. экономия явная, но на современном компьютере она не заметна (во всяком случае в подавляющем большинстве задач).
Dron

Dron (статус: Студент), 21 ноября 2006, 15:44 [#6]:

mvp: спасибо за такую обширную информацию :-) Тема очень интересная. Думаю, всем пойдёт на пользу.
С уважением.
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;

Перевести на паскаль - особых проблем не должно вызвать. Тут учтены артефакты с не буквами :)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 24 августа 2017, 02:05
Выполнено за 0.48 сек.
Рейтинг@Mail.ru