Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите решить задачу, Несложная задача на Си, пожалуйста помог 
:(
    Опции темы
Leere
Дата 18.9.2005, 19:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











записать на Си выражение, истинное при выполнении указанного условия и ложное в противном случае, если только одно из чисел x, y, z положительно.
Заранее спасибо.
Очень срочно.
  Вверх
Mayk
Дата 18.9.2005, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



Решение в лоб:
Код

((x>0) && (y<=0) && (z<=0)) ||
((y>0) && (x<=0) && (z<=0)) ||
((z>0) && (y<=0) && (x<=0)))


Решение для настоящих извращенцев:
Код

    int a,b,c;
    a=-1;    b=1;    c=0;
    bool r = ((a >> 31) + ( b >>31 ) + (c >> 31)  // минус кол-во отрицательных чисел
        - (a == 0) - (b == 0) - (c == 0)) //минус кол-ва нулей
        == -2; //кол-во не положительных чисел == 2

    cout<<r;


Кол-во операций во втором вроде меньше smile
(в первом 9 операций сравнения и 6 AND'ов и 2 OR'а. 9+6+2=17. Во втором 3 сдвига, 2 сложения, 3 вычитания, одно сравнение. 3+2+3+1=9 smile))))
Добавлено @ 19:37
Вот еще можно. ((a > 0) + (b > 0) + (c > 0) == 1) - кол-во положительных чисел равно 1 smile

Это сообщение отредактировал(а) Mayk - 18.9.2005, 19:43


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
bel_nikita
Дата 18.9.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



Так можно проверить самый старший бит. Если он в единице - отрицательное число smile

Вот, примерчик при условии, что sizeof(int) равно 4 байта:
Код

bool IsNegativeNumber( int ix ) { return ix & 0x80000000 ? true : false; }

bool SomeFunctuion( int x, int y, int z )
{
 return !( IsNegativeNumber( x ) || IsNegativeNumber( y ) || IsNegativeNumber( z )  );
}


З.Ы.: можно конечно IsNegativeNumber через шаблон написан, но автору топика я думаю и этого будет достаточно


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mayk
Дата 18.9.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 1
Всего: 134



Возможна загвоздка - 0 не является положительным числом в строгом смысле(во всяком случае различают понятия неотрицательное число и положительное число).
Хотя с другой стороны во флоатах существуют положительные и отрицательные нули.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Romikgy
Дата 19.9.2005, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 7
Всего: 146



Код

bool Otvet(int x, int y, int z) { return ((x>>31) & (y>>31) & (z>>31));}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Leere
Дата 20.9.2005, 11:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











2Mayk, 2 bel nikita : Пасибо, вы меня спасли от недопуска к лабораторке!
  Вверх
sergejzr
Дата 20.9.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 1
Всего: 360



Тема перенесена из С++


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0483 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.