Название: Искусство программиования (задача 6) Отправлено: LazarusLong от Июль 22, 2007, 09:51:25 Даны две целочисленные переменные. Вывести значение большей из них. Не использовать условные конструкции типа if, case, switch и т.п. Также не использовать логические операторы (>, <. >=, <=, ==, != и т.п.). Также запрещено использование ЛЮБЫХ функций сравнения типа strcmp (то есть вариант преобразовать в строку и сравнить не проходит ;) ), min, max и т.п.
Да.... поразрядные операции, всякие там сдвиги, побитовые и, или, не, хор и т.п. тоже не использовать. ;) Ответы принимаются на С/С++ (в принципе решить можно на чем угодно, но ответ должен быть представлен на С/С++). Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 22, 2007, 10:07:09 Оператор ? тоже не использовать ;)
Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 22, 2007, 12:23:53 Мозги полезно напрягать? Наверное ...
Тогда моё решение вот : Код: main () { P.S. Интересно, а "goto" можно было использовать ... P.S.S. Помоему в мае с нашего факультета ездила команда на олимпиаду по программированию в Киев ... не знаю что там и как, но больше всего меня поразило, то что я об этом узнал совершенно случайно ... никакого ни объявления ... ни каких отборочных на олимпиаду ... как набирали команду ... загадка ... ??? А я хотел поехать ... но узнав слишком поздно и не найдя господина Дегтяренко (который вроде бы заведовал набором "олимпиадчиков") тогда в пятницу, я отпустил это желание ... и кое в чём разочаровался ... Вот так вот ... тебе и КИТы ... :-[ Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 22, 2007, 01:16:23 Дерективы тоже можно добавить:
Код: #include <stdio.h> Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 22, 2007, 01:25:26 Да директивы - то не сильно важно. И точка с запятой тоже ;). Важна суть решения. А решение верное. Заслуженный +1.
Но викторина не завершается. Существует еще как минимум одно решение. ЗЫ. goto использовать можно, равно как и инструкции циклов. Цитировать Мозги полезно напрягать? Наверное ... Чтобы не расслаблялись тут на каникулах ;) Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 22, 2007, 06:20:27 А решение верное. Заслуженный +1. ха-ха-ха. Башоргчег. ))Название: Re: Искусство программиования (какя там по счету?) Отправлено: naxellar от Июль 23, 2007, 10:55:26 Код: r=fabs(a-b); Название: Re: Искусство программиования (какя там по счету?) Отправлено: BODROV от Июль 23, 2007, 01:46:55 ... использовать можно ... инструкции циклов. Также не использовать логические операторы (>, <. >=, <=, ==, != и т.п.). не сходиться ???Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 23, 2007, 02:05:32 ... использовать можно ... инструкции циклов. Также не использовать логические операторы (>, <. >=, <=, ==, != и т.п.). не сходиться ???Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 23, 2007, 03:10:10 Циклы можно использовать в том смысле - что я не возражаю против их применения. Хотя и не могу представить, как их можно сюда прикрутить. Впрочем, в условии цикла совсем не обязательно должен встречаться условный оператор. Условие цикла это вообще выражение целого типа где 0 - ложь, а все остальное истина.
К примеру Код: i = 5 ЗЫ: naxellar, насчет fabs - RTFM Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 23, 2007, 03:17:30 Циклы можно использовать в том смысле - что я не возражаю против их применения. Хотя и не могу представить, как их можно сюда прикрутить. Гы. Я уже представил... С#-меговариант готов. Ща его же на С++ забацаю. ))Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 23, 2007, 03:18:34 Ню-ню... ждемс ;)
Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 23, 2007, 03:42:27 Таксь, готово.
Итак, общая идея метода: из двух целых чисел с разными знаками, очевидно, больше неотрицательное число. Из двух отрицательных чисел больше то, которое по шкале чисел ближе к нулю. Из двух неотрицательных чисел больше то, которое дальше от нуля. Код: int main () Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 23, 2007, 03:55:53 16 ошибок ;).
Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 23, 2007, 03:56:50 Ох ее )))
Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 23, 2007, 04:06:43 Но даже после выправления синтаксиса не работает ;), Вылаетает с ошибками :D :D :D Да и вообще есть способ гораздо проще. Буквально в три строки ;).
Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 23, 2007, 04:07:37 Но даже после выправления синтаксиса не работает ;), Вылаетает с ошибками :D :D :D Да и вообще есть способ гораздо проще. Буквально в три строки ;). Ну клево что есть в три. Зато у меня мего-способ. )) И все там работает... ща буду ставить билдер. )))Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 23, 2007, 06:38:19 Я не стал свой второй способ выкладывать ... может кто то ещё решит ... А вообще я удивлён такой малой популярностью этой викторины ... и даже задача не из мега сложных же (((
Название: Re: Искусство программиования (какя там по счету?) Отправлено: naxellar от Июль 24, 2007, 01:48:18 ЗЫ: naxellar, насчет fabs - RTFM Я догадусь, что это модуль, но почему f в начале?Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 24, 2007, 06:58:48 ЗЫ: naxellar, насчет fabs - RTFM Я догадусь, что это модуль, но почему f в начале?Загляни в какой нибудь справочник по С и скажи мне какая функция абсолютного значения? Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 24, 2007, 10:58:27 Поставил Билдер...Как-то он не по понятиям с исключениями работает... )))
Ушел читать стандарт С++. ))) Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 24, 2007, 06:55:48 Итак, по результатам сегодняшнего мини-исследования можно констатитровать:
1) В консольном не-VCL проекте на Билдере блок Код: catch(...) Подозреваю, что это связано с реализацией VCL-класса исключения EDivByZero еще на объектном Паскале в Дельфи, откуда она была импортирована в Билдер. Соотвественно, в коде Код: int a = 10, b =0; 2) Функция sqrt, будучи описанной и реализованной еще в библиотеке языке С, при ошибках в аргументе, связанных с областью определения функции не вызывает исключений. Соответственно, обработка подобных ошибок осуществляется не через механизм исключений, а через глобальную С-переменную errno. Учитывая эти находки был написан новый мего-код на стандартном C++: Код: #include <vcl.h> // Только для Билдера, что связано с особенностями реализации классов-исключений. Кстати, компилятор MS Visual C++ .NET 2005 генерит код, который корректно ловит все исключения независимо от типа проекта. Вариант для MS Visual C++: Код: private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Почувствуйте мощь и силу С++ с костылями для новой платформы .. ))) З.Ы. Спасибо товарищу BODROV-у за активную помощь в ловле блох. )) Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 24, 2007, 06:58:05 Ёпсель как тут много ....
Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 24, 2007, 08:06:05 Кто еще не оптимальнее напишет? :D
Sochin, ладно, идея ясна и имеет право на существование. Никаких требований к оптимальности я не предъявлял, посему +1 ;). Викторина продолжается. Есть еще один очень простой способ Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 24, 2007, 10:16:48 Кто еще не оптимальнее напишет? :D Полагаешь неоптимально использование для организации ветвлений исключений в принципе? Какие другие варианты для ветвлений без использования условных операторов? ))) Самое неоптимально в последнем варианте это сравнение кода ошибки через пересечение множеств, тут уж увы поделать нечего. )))Цитировать Викторина продолжается. Есть еще один очень простой способ Очень интересно глянуть на решение. Надеюсь этот способ относится больше к области программирования, а не математики как первое решение в этом топе. )Название: Re: Искусство программирования (какя там по счету?) Отправлено: tendervampire от Июль 24, 2007, 10:31:28 Касательно сомнений в возможности прикрутить циклы. Как вариант:
Код: void main() Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 24, 2007, 11:49:43 tendervampire
Да, насчет циклов я погорячился. Хотя это просто по сути замена для if - цикл выполняющийся один раз. Да и этот код не будет работать если a и b равны - оба условия циклов равны 0. Sochin, первое решение, приведенное NunTerix'ом - по видимому самое оптимальное. По крайней мере оно оптимальнее моего. Что же твоего решения - то оно является не оптимальным для решения данной конкретной задачи. Для других случаев подобный подход может быть оптимальным, не спорю. Все зависит от задачи. Если хочешь, кстати, могу в ЛС тебе написать свой вариант. Здесь открывать пока не хочется ;). Название: Re: Искусство программирования (какая там по счету?) Отправлено: tendervampire от Июль 25, 2007, 02:04:22 Уважаемый LazarusLong! При условии равенства А и Б действительно не происходит никаких действий, но в условии задачи ничего не сказано о равенстве. Прикрутить проверку равенста - сложности не представляет. То, что в данном случае while работает как if не является нарушением условий задачи. Как говорится, в умелых руках... P.S. Сколько раз зарекался не работать без подписанного тех.задания :) . Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 25, 2007, 06:04:23 Да ничего против я не имею. Просто считаю, что если, к примеру, в последовательности все элементы равны, это на значит, что в ней нет максимального значения. Просто оно(значение) в таком случае совпадает с минимальным;).
А насчет циклов - мне сложно было представить как их использовать в этой задаче в своей первоначальной цели - организации повторяющихся вычислений в программе. Хотя подумав немного придумал ;). Код: int a=10, b=5; Не пробовал это запускать, но по идее должно работать ;). Зато здесь цикл как цикл - выполняет повторяющиеся действия ;) ;) ;). Вот в каком смысле я не представлял использование циклов ;). Но, как известно, было бы желание, можно и гвозди микроскопом забивать ;). Название: Re: Искусство программиования (какя там по счету?) Отправлено: tendervampire от Июль 25, 2007, 12:09:06 Начинает происходит типичное для невербального общения непонимание :)
Это, конечно, похоже на флуд, но вот варинт с проверкой равенства: Код: void main() Принцип вычисления для последовательностей с l>2 - как для вычисления НОК. Схематично: Код: int Max(int a,int b) Безусловно, вариант не оптимальный. Вариант NunTerix'a куда лучше. Но с if не сравнить :D Насчет применения в реальной жизни - если мне придется писать на языке, который будет похож на указанный в задании, я с создателем языка сделаю что-нибудь плохое томиком Стауструпа :) А насчет гвоздей и микроскопа - всякое в жизни бывает, вдруг, забивание гвоздя - дело жизни и смерти :) Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 25, 2007, 05:43:30 Ладно. Замнем для ясности. +1.
Насчет языка. Дык без ограничений сильно просто было бы и не интересно ;). Ясное дело, что на таком языке без условных операторов и всего прочего вряд ли придется писать ;) Кстати мне сегодня пришла в голову еще одна идея как можно решить данную задачу. Как то обыграть ситуацию, что а/b = 0 если а меньше b и не 0 в противном случае. Правда, будет работать только для а>=0, b>0. Название: Re: Искусство программиования (какя там по счету?) Отправлено: tendervampire от Июль 25, 2007, 06:59:10 Интересно, можно подумать. b==0 можно отловить exception'ом. А +/- можно отловить опять же while( znach+abs(znach)) :D. Но в итоге получается самый неоптимальный вариант из всех представленных :))) А для неотрицательных - очень даже симатично.
Название: Re: Искусство программиования (какя там по счету?) Отправлено: naxellar от Июль 26, 2007, 01:32:37 Загляни в какой нибудь справочник по С и скажи мне какая функция абсолютного значения? abs, fabs, etc. Причем fabs для вещественных чисел, которыми тут и не пахнетНазвание: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 26, 2007, 09:15:40 fabs - только для вещественных чисел? :o
Название: Re: Искусство программиования (какя там по счету?) Отправлено: naxellar от Июль 26, 2007, 09:19:33 fabs - только для вещественных чисел? :o Не думаю, что только, но она не нужна так как есть обычная abs (Я так понял)Название: Re: Искусство программиования (какя там по счету?) Отправлено: tendervampire от Июль 26, 2007, 12:06:55 По результату, abs и fabs идентичны. Просто abs в чистом с отсутствует. А с++ без разницы, что использовать.
Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 26, 2007, 05:18:20 По результату, abs и fabs идентичны. Просто abs в чистом с отсутствует. Ну вот .... а писалось, предполагая, что только на С ... так что naxellar нужна .... Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 26, 2007, 07:12:38 abs есь и в С. Вернее в Сишном math.h - есть функция abs со следующим прототипом:
int abs(int). Кроме того: double fabs(double) long labs(long) и еще для комплексных чисел ;) Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 26, 2007, 07:19:57 Я не пойму из-за чего весь спор? Тип int приводится к типу double, так что вариант fabs годится. )
Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 26, 2007, 07:36:37 То что int приводится к double это ясно. А double приводится к int? Ведь в варианте NunTerix'a нужно как раз именно такое приведение.
Название: Re: Искусство программиования (какя там по счету?) Отправлено: Sochin от Июль 26, 2007, 08:00:02 То что int приводится к double это ясно. А double приводится к int? Ведь в варианте NunTerix'a нужно как раз именно такое приведение. Ну дык неявно вроде не приводитса.Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 26, 2007, 08:02:36 Вот вот и я о том же.
Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 26, 2007, 09:19:09 О горе ... поставьте в моём варианте abs ... и будет счастье :) Всё равно решения проще и оптимальнее пока что не было ...
Я человек без компилятора, транслятора ... поэтому использую пока что исключительно свой мозг ... И всем советую ... нежели хвататься за среду разработки и городить кучю текста... Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 26, 2007, 09:21:21 Кстати, если бы в задании было указано, что используются только положительные числа, то у меня ещё найдётся проще вариант :)
Название: Re: Искусство программиования (какя там по счету?) Отправлено: tendervampire от Июль 26, 2007, 10:24:14 Цитировать abs есь и в С. Вернее в Сишном math.h - есть функция abs со следующим прототипом Согласен, невнимательно подсмотрел в Страуструпе. Зацепился за слова "в С отсутствует", а на прототип не посмотрел. И все же сильно хотелось бы увидеть вариант решения автора вопроса. Название: Re: Искусство программиования (какя там по счету?) Отправлено: LazarusLong от Июль 26, 2007, 10:41:46 NunTerix
Не такой ли? Код: int a=10, b=15; :) Название: Re: Искусство программиования (какя там по счету?) Отправлено: NunTerix от Июль 27, 2007, 11:53:13 LazarusLong, да такое ... и может быть ещё одно ... если ответите мне, что будет в результате на С для:
6%23 -6%23 -6%-23 6%-23 6/23 -6/23 -6/-23 6/-23 Название: Re: Искусство программиования (задача 6) Отправлено: LazarusLong от Июль 27, 2007, 12:18:06 6%23 = 6
-6%23 = -6 -6%-23 = -6 6%-23 = 6 6/23 = 0 -6/23 = 0 -6/-23 = 0 6/-23 = 0 Название: Re: Искусство программиования (задача 6) Отправлено: NunTerix от Июль 27, 2007, 12:35:11 6%23 = 6 -6%23 = -6 -6%-23 = -6 6%-23 = 6 Интересное взятие по модулю ... а поподробнее мона? Название: Re: Искусство программиования (задача 6) Отправлено: vimmax от Август 01, 2007, 02:00:33 LazarusLong а твой какой вариант ?
Название: Re: Искусство программиования (задача 6) Отправлено: NunTerix от Май 20, 2008, 03:38:06 LazarusLong и действительно, прошло столько времени, а твоего решения не было ... а? П.С. может ещё задачу какую нибудь найдёшь? И желательно что бы не много писанины требовалось бы :D А то до сих пор нет компилятора под руками :-[ Название: Re: Искусство программиования (задача 6) Отправлено: Магнетон Бора от Июль 02, 2008, 06:27:25 Народ, зачем тут генирировать исключения, циклы ? может просто сделать вот так:
#include<conio.h> #include<iostream.h> #include<math.h> int main() { clrscr(); int a,b; int max; cout<<"a = "; cin>>a; cout<<"\nb = "; cin>>b; max = (a + b + abs(a - b) )/2; cout<<"\nmax = "<<max<<endl; cin.ignore(); return 0; } P.S. кто не верит, пусть проверит ))) Название: Re: Искусство программиования (задача 6) Отправлено: LazarusLong от Июль 02, 2008, 08:38:55 Вариант решения идентичен предложенному NunTerix'ом в этом посте (http://kita.org.ua/index.php/topic,1952.msg24526.html#msg24526).
Прошу у всех прощения за то, что тупо морожусь на просьбы выложить свой вариант. не могу найти файлик с исходником, а так не помню уже. Там был какой-то арифметический выкрутас, но совсем другой. |