Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2013, 22:14   #1
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию 3 переменных по возрастанию с помощю switch

Вводятся три числа A, B и C. Нужно распечатать их по убыванию. В программе использовать только один оператор switch и ничего больше.
Как его вообще решить, не пойму.
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 28.01.2013, 12:55   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Дурацкая задача.
Массив из трёх чисел можно упорядочить шестью способами (т.е. нам нужен switch с минимум шестью ветками). Такое значение собирается, но все приходящие в голову способы достаточно искусственные.
Код:
switch ( (A>B?1:0)+(B>C?2:0)+(C>A?4:0) )
Как пример.
Abstraction вне форума Ответить с цитированием
Старый 28.01.2013, 16:44   #3
Izobara
Форумчанин
 
Аватар для Izobara
 
Регистрация: 26.12.2012
Сообщений: 227
По умолчанию

Хм, так case'ов сколько угодно, сам switch 1
"I believe I can fly" - C++, "What do you want from me" - Delphi, "Yesterday" - Pascal, "Let it be" - C#... Программисты-музыканты-полиглоты поймут
Izobara вне форума Ответить с цитированием
Старый 28.01.2013, 17:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Izobara
А в представленном итак свитч один
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.01.2013, 23:24   #5
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Что-то вообще бред какой-то. Как можно одним свичем так сделать, без условных операторов? Ну если конечно считать ?: за условный оператор. В кейсах могут быть только константы, значит максимум что мы можем так выяснить - например, является ли одно из этих чисел наименьшим) Ну или типа того. Думаю, что-то в задании ещё должно быть разрешено...
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 29.01.2013, 00:09   #6
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Да уж, что-то меня зацепила эта задачка) Посидев немного, родил следующее решение, не использующее никаких условных действий, кроме единственного свича:
Код:
        static int Abs(int a)
        {
            int isNegative = ((a >> 31) & 1);
            int isPositive = ~isNegative & 1;
            return isNegative * (~a + 1) + isPositive * a;
        }

        static int Max(int a, int b)
        {
            return (a + b + Abs(a - b))/2;
        }

        static int Min(int a, int b)
        {
            return (a + b - Abs(a - b)) / 2;
        }

        static int[] Sort(int a, int b, int c)
        {
            var result = new int[3];
            var maxAB = Max(a, b);
            var maxBC = Max(b, c);
            var veryMax = Max(maxAB, maxBC);
            result[0] = veryMax;
            switch (veryMax == b) 
            {
                case true:
                    result[1] = Max(a, c);
                    result[2] = Min(a, c);
                    break;
                default:
                    result[1] = Min(maxAB, maxBC);
                    result[2] = Min(a, Min(b, c));
                    break;
            }
            return result;
        }
Функция возвращает массив 3 чисел, отсортированный по убыванию, для удобства. Но в таком виде задачка явно не на использование свича)
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 29.01.2013, 09:42   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а чем Вам вариант (с) Abstraction не подошёл?!

Имхо, вполне себе работоспособный вариант:
Код:
            Console.WriteLine("Исходные числа: {0} {1} {2}", A, B, C);

            switch ((A > B ? 1 : 0) + (B > C ? 2 : 0) + (C > A ? 4 : 0))
            {
                case 1:
                    Console.WriteLine("Результат 1 ((c) Abstraction ): {0} {1} {2}", A, C, B);
                    break;
                case 2:
                    Console.WriteLine("Результат 2 ((c) Abstraction ): {0} {1} {2}", B, A, C);
                    break;
                case 3:
                    Console.WriteLine("Результат 3 ((c) Abstraction ): {0} {1} {2}", A, B, C);
                    break;
                case 4:
                    Console.WriteLine("Результат 4 ((c) Abstraction ): {0} {1} {2}", C, B, A);
                    break;
                case 5:
                    Console.WriteLine("Результат 5 ((c) Abstraction ): {0} {1} {2}", C, A, B);
                    break;
                case 6:
                    Console.WriteLine("Результат 6 ((c) Abstraction ): {0} {1} {2}", B, C, A);
                    break;
                default:
                    Console.WriteLine("- ошибка - необработанная веточка: код = {0}", (A > B ? 1 : 0) + (B > C ? 2 : 0) + (C > A ? 4 : 0));
                    break;
            }
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2013, 11:26   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
(A > B ? 1 : 0)
Потому что вот это - условие. А если надо использовать только один свич, то логично предполжить, что использовать условия нельзя, иначе задача вообще ни о чем...
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 29.01.2013, 11:58   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Selestis
Потому что вот это - условие
идиотские задачи нужно решать идиотскими методами.
может, Вы правы, а может - и нет...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2013, 22:34   #10
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Я собственно и не отрицаю идиотизма задачки) Тем более тогда уж можно вообще без условий обойтись...
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В файле f элементы упорядочены по возрастанию.требуется слить эти файлы в один файл,также упорядоченный по возрастанию ayoka Паскаль, Turbo Pascal, PascalABC.NET 2 16.05.2012 21:51
описать процедуру которая объединяет 2 упорядоченных по возрастанию списка в один упорядоченный по возрастанию Анастасья Помощь студентам 0 28.11.2011 17:33
Из двух упорядоченных по возрастанию массивов, получить третий, упорядоченный по возрастанию.(в обычном варианте и через bufalo C# (си шарп) 4 17.10.2011 14:52
сделать из трёх массивов по возрастанию один по возрастанию Novenkaja Помощь студентам 5 23.03.2011 21:18
проверка списка с помощю empty jon888 PHP 5 09.11.2009 13:24