|   |   | 
| 
 | OFF: конкурс по оптимизации кода pascal | ☑ | ||
|---|---|---|---|---|
| 0
    
        program345 24.07.14✎ 08:15 | 
        главный приз - признание форумчан.
 задача: вводим три разные числа и надо найти максимальное но с выводом номера числа. Например: вводим первое-1, второе-2, третье-3; вывод должен быть: наибольшее третье число. примечание: если числа одинаковые это должно быть учтено, если максимальных чисел 2 это тоже должно быть учтено. мое решение: var a,b,c:integer; begin write('введите 3 числа через пробел: '); read(a,b,c); if (a>b)and (a>c) then writeln('самое большое число введено первым') else if (b>c) and (b>a) then writeln('самое большое число введено вторым') else if (c>a) and (c>b) then writeln('самое большое число введено третьим') else if (a=b) and (b=c) then writeln('введенные числа равны'); if (a=b)and (a>c) then writeln('самые больные числа - первое и второе ') else if (a=c)and (a>b) then writeln('самые больные числа - первое и третье') else if (b=c) and (b>a) then writeln('самые больные числа - второе и третье'); end. платформа PascalABC http://pascalabc.net | |||
| 1
    
        Ненавижу 1С гуру 24.07.14✎ 08:17 | 
        >>самые больные числа
 порадовало | |||
| 2
    
        Wobland 24.07.14✎ 08:17 | 
        массив чисел, массив найденных индексов     | |||
| 3
    
        shuhard 24.07.14✎ 08:17 | 
        (0)[главный приз - признание форумчан. ]
 УГ твой паскаль, древний как гауно мамонта | |||
| 4
    
        Wobland 24.07.14✎ 08:18 | 
        что-то поздновато для сессии     | |||
| 5
    
        Ненавижу 1С гуру 24.07.14✎ 08:18 | 
        А почему не 1С? разницы собственно никакой     | |||
| 6
    
        Ненавижу 1С гуру 24.07.14✎ 08:30 | 
        (0) как минимум последнее условие лишнее, варианты окончились     | |||
| 7
    
        Ненавижу 1С гуру 24.07.14✎ 08:37 | 
        (0) наколеночное творение:
 А=1; Б=2; В=3; Если А>Б Тогда Если А>В Тогда Сообщить("1"); ИначеЕсли А=В Тогда Сообщить("1 3"); Иначе Сообщить("3"); КонецЕсли; ИначеЕсли Б>В Тогда Если А=Б Тогда Сообщить("1 2"); Иначе Сообщить("2"); КонецЕсли; ИначеЕсли Б=В Тогда Если А=Б Тогда Сообщить("1 2 3"); Иначе Сообщить("2 3"); КонецЕсли; Иначе Сообщить("3"); КонецЕсли; | |||
| 8
    
        vde69 24.07.14✎ 08:40 | 
        мой препод первое чего сделал-бы на приемке это ввел такие числа "0" "Х" "К"....     | |||
| 9
    
        Ненавижу 1С гуру 24.07.14✎ 08:42 | 
        (8) я думаю, автор предполагал корректные данные, ибо это уже совсем другая задача     | |||
| 10
    
        SeraFim 24.07.14✎ 08:44 | 
        (9) писать защиту от дурака тоже надо уметь     | |||
| 11
    
        vde69 24.07.14✎ 08:45 | 
        (9) нормализация ввода в паскале - это ОБЯЗАНОСТЬ, по тому как язык имеет строгую типизацию.     | |||
| 12
    
        Эмбеддер 24.07.14✎ 08:46 | 
        (0) открой для себя массивы     | |||
| 13
    
        butterbean 24.07.14✎ 08:46 | 
        м = макс(а,б,в);
 т = ""; Если а = м тогда т = "1" конецЕсли; Если б = м тогда т = т + " 2" конецЕсли; Если в = м тогда т = т + " 3" конецЕсли; сообщить(т); | |||
| 14
    
        MiniMuk 24.07.14✎ 08:46 | 
        Г = максимум(максимум(А,Б),В);
 Если А= г тогда writeln('самое большое число А'); Если Б= г тогда writeln('самое большое число Б'); Если В= г тогда writeln('самое большое число В'); | |||
| 15
    
        butterbean 24.07.14✎ 08:47 | 
        массивы нах, не наш метод :-)     | |||
| 16
    
        vde69 24.07.14✎ 08:47 | 
        и еще вариант ввода
 "1" "1" "1" | |||
| 17
    
        Ненавижу 1С гуру 24.07.14✎ 08:48 | 
        (10)(11) я это прекрасно понимаю и считаю эту задачу проверки данных также важной, но ИМХО, эта задача тут боком     | |||
| 18
    
        Эмбеддер 24.07.14✎ 08:49 | 
        (17) + т.е. в принципе считывать число штатными средствами паскаля для лабораторной работы нельзя? и считывать строку, потом преобразовывать ее в число     | |||
| 19
    
        СвинТуз 24.07.14✎ 08:52 | 
        оптимизация бывает разной 
 если на длину кода это одно если на быстродействие, то кейс и наверное лучше не будет если на ресурсы то ввод по одному и двумя переменными можно обойтись. | |||
| 20
    
        MiniMuk 24.07.14✎ 08:52 | 
        (8) если считавать readln("%d", А)
 вроде не даст ввести не число | |||
| 21
    
        MiniMuk 24.07.14✎ 08:53 | 
        (19) Еще можешь добавить читаемость кода     | |||
| 22
    
        СвинТуз 24.07.14✎ 08:54 | 
        (18)
 давно в паскале работали? ) там жесткая типизация и нет графического интерфейса ... раньше не было. Если это не делфи конечно. | |||
| 23
    
        СвинТуз 24.07.14✎ 08:57 | 
        (19)
 *тремя , количество дублей нужно хранить | |||
| 24
    
        Эмбеддер 24.07.14✎ 09:04 | 
        (22) если вместо числа ввести строку, программа вылетит. у нас преподы действительно могли ввести строку вместо числа. но не для лабораторной работы, это должна быть курсовая     | |||
| 25
    
        skunk 24.07.14✎ 09:06 | 
        (24)программа не вылетит ... если использовать правильные директивы     | |||
| 26
    
        СвинТуз 24.07.14✎ 09:07 | 
        (24)
 я уже не помню ничего ... var a,b,c:integer; read(a,b,c); а даст ввести буквы? | |||
| 27
    
        sda553 24.07.14✎ 09:11 | 
        Решение масштабируемое на любое количество чисел со сложностью О(N)
 const N=3 var i,max :integer; a:array[1..N] of integer; begin writeln('введите три числа'); for i:=1 to N begin readln(a[i]); if a[i]>max then max:=a[i]; end; for i:=1 to 3 if a[i]=max then writeln(i); end | |||
| 28
    
        Ярус 24.07.14✎ 09:12 | 
        тс хитроопый студент, которому задали задачку, разводит     | |||
| 29
    
        Эмбеддер 24.07.14✎ 09:14 | 
        (25) видимо да. но по крайней мере буквы с консоли будут вводиться всегда, независимо от директив
 (26) вот специально скачал turbo pascal, ввел букву вместо цифры, нажал enter. Error 106: Invalid numeric format | |||
| 30
    
        Эмбеддер 24.07.14✎ 09:16 | 
        (25) у Турбо паскаля точно есть такая директива? может у Борланда конечно сделали, но у Турбо мало чего на Compiler Options есть     | |||
| 31
    
        VladZ 24.07.14✎ 09:18 | 
        (0) Однако не быть тебе программистом.     | |||
| 32
    
        VladZ 24.07.14✎ 09:19 | 
        +31 Мыслишь только категориями "Если - то".     | |||
| 33
    
        VladZ 24.07.14✎ 09:20 | 
        Настоящий программист мыслит алгоритмами.     | |||
| 34
    
        Эмбеддер 24.07.14✎ 09:20 | 
        (32) всегда должен быть вариант Иначе?     | |||
| 35
    
        skunk 24.07.14✎ 09:27 | 
        (30)точно ... у них различия были в другом     | |||
| 36
    
        VladZ 24.07.14✎ 09:29 | 
        (34) Речь не о том. Код не должен быть перегружен конструкциями "Если - то - иначе". Достаточно сравнить (0) и (27). В (27) четко прослеживается алгоритм: 
 1. Ввести числа. 2. Найти максимальное. 3. Показать максимальные числа. Т.е. есть определенный порядок (он как известно начинается в голове). В (0) порядка нет. Сплошные "если"... | |||
| 37
    
        Соло 24.07.14✎ 09:41 | 
        в (27) есть недоделки, а именно нет первоначального определения max (но при этом всё будет работать из среды, но выдаст ошибку при работе в EXE, компилятор очищает переменные при инициализации), ну и в последнем цикле опечатка 3 вместо N     | |||
| 38
    
        sda553 24.07.14✎ 09:43 | 
        (37) Я аналитик, а не программист. Подал идею реализации, а дальше пусть программеры дошлифовывают     | |||
| 39
    
        VladZ 24.07.14✎ 09:45 | 
        +36 Если мне, как преподавателю, принесли алгоритм как в (0). Я бы попросил решить эту задачу для 10 значений. Потом для 20ти. Потом для 100... Пока автор не начнет мозг напрягать.     | |||
| 40
    
        mzelensky 24.07.14✎ 10:12 | 
        Задача фигня - есть интересней, как мне кажется:
 Даны 2 числа (любые!!!). Нужно определить какое из них больше, но при этом ЗАПРЕШЕНО использовать операторы сравнения (функции макс, мин, свитч и так далее тоже нельзя). Язык реализации любой (паскаль, си, ява, 1С...) | |||
| 41
    
        sda553 24.07.14✎ 10:17 | 
        (40) баян, не интересный     | |||
| 42
    
        mzelensky 24.07.14✎ 10:18 | 
        (41) Ну если знаешь решение, то не подсказывай. Остальные пусть подумают.     | |||
| 43
    
        Asmody 24.07.14✎ 10:18 | 
        а вот так эта задача решается на python
 b = [a.index(x) for x in a if x == max(a)] почувствуйте разницу | |||
| 44
    
        sda553 24.07.14✎ 10:19 | 
        (43) почти никакой     | |||
| 45
    
        Asmody 24.07.14✎ 10:20 | 
        (44) с (27) никакой. но какова выразительность языка!     | |||
| 46
    
        Wobland 24.07.14✎ 10:21 | 
        (40) Сортировать() - не оператор сравнения     | |||
| 47
    
        Ненавижу 1С гуру 24.07.14✎ 10:22 | 
        (46) тогда и Макс не оператор сравнения     | |||
| 48
    
        sda553 24.07.14✎ 10:25 | 
        (43) тут еще недочет, операция max имеет сложность О(n), и она у тебя она вызывается в цикле по n. В итоге, хоть это выражение и записывается так просто, оно будет иметь сложность o(n^2).
 Так что на больших массивах выгоднее будет пожертвовать красотой и определить-запомнить max за границами цикла | |||
| 49
    
        Wobland 24.07.14✎ 10:25 | 
        (47) mzelensky говорит, что это функция     | |||
| 50
    
        Ненавижу 1С гуру 24.07.14✎ 10:28 | 
        (49) ну он еще говорит, что "и так далее тоже нельзя"     | |||
| 51
    
        Wobland 24.07.14✎ 10:29 | 
        (50) может, он нам ещё складывать запретит? постановка задачи некорректна имхо     | |||
| 52
    
        Ненавижу 1С гуру 24.07.14✎ 10:33 | 
        (51) постановка скорее корректна, вот только решения в рамках 1С нет
 в Джава вроде есть за счет битовых операторов http://habrahabr.ru/post/124878/ | |||
| 53
    
        mzelensky 24.07.14✎ 10:40 | 
        (51) Давай не будем ЛЯ-ля!!! Как ты сделаешь сортировку без сравнения? Покажи!
 Если ты явно не вызываешь операторы сравнения, то это еще не значит ,что метод "Сортировать" их не вызывает, а это по условию задачи - запрещено! | |||
| 54
    
        Ненавижу 1С гуру 24.07.14✎ 10:40 | 
        (40) 
 Середина = (А+Б)/2; МодульРазности = Pow(Pow(А-Б,2),0.5); Результат = Середина+МодульРазности/2; | |||
| 55
    
        sda553 24.07.14✎ 10:41 | 
        (52) Тут подвох. Побитовые операции ни при чем.
 Выражение x*'Y' имеет внутри языка реализацию в виде цикла по x с выводом 'Y'. Любой цикл имеет внутри условие выхода из него. Т.е. в данном случае в выражении используются условное сравнение скрытое в реализации оператора. | |||
| 56
    
        Wobland 24.07.14✎ 10:43 | 
        (53) функция, возвращающая максимум из двух чисел есть. миниму тоже. поменять местами два элемента массива без сравнения можно. а что там находится внутри Сортировать(), мне не интересно ;)     | |||
| 57
    
        Wobland 24.07.14✎ 10:44 | 
        +(56) мало ли где встретится какой-нибудь je или jne ;)     | |||
| 58
    
        Ненавижу 1С гуру 24.07.14✎ 10:45 | 
        (55) ошибаешься, там арифметическое умножение     | |||
| 59
    
        sda553 24.07.14✎ 10:47 | 
        (58) А, точняк     | |||
| 60
    
        mzelensky 24.07.14✎ 10:51 | 
        (56) Чувак, не тупи - сегодян не пятница. Написано же:
 ЗАПРЕШЕНО использовать операторы сравнения функции макс, мин, свитч и так далее тоже нельзя. Какой нафиг: "функция, возвращающая максимум из двух чисел есть. миниму тоже" | |||
| 61
    
        Wobland 24.07.14✎ 10:55 | 
        (60) 1. плохо написано, не доходит
 2. хорошо, нет. можно создать | |||
| 62
    
        mzelensky 24.07.14✎ 10:58 | 
        (54) Что-то до меня не доходит что в "результате" должно получиться.
 Например при А = -10 Б = 5,6 | |||
| 63
    
        Ненавижу 1С гуру 24.07.14✎ 11:02 | 
        (62) 5.6 должно получиться     | |||
| 64
    
        sda553 24.07.14✎ 11:03 | 
        Тогда аналог побитовой операции x>>1 в 1с будет
 Цел(x/2), а аналогом а^b будет Рез=0; bitA = a-2*Цел(a/2); a=Цел(a/2); bitB = b-2*Цел(b/2); b=Цел(b/2); Рез=Рез+(bitB*bitB-bitA*bitA)*(bitB*biB-bitA*bitA); bitA = a -2*Цел(а/2); а=Цел(а/2); ... и т.д, 8 раз для каждого бита | |||
| 65
    
        sda553 24.07.14✎ 11:05 | 
        (64) это к 52     | |||
| 66
    
        mzelensky 24.07.14✎ 11:05 | 
        (62) Я просто не помню что делает "Pow("
 Мы так делали: Попытка Результат = Sqrt(А-Б); Сообщить("А больше") Исключение Сообщить("Б больше") КонецПопытки; | |||
| 67
    
        sda553 24.07.14✎ 11:08 | 
        (66) используется условие в реализации оператора, незачет     | |||
| 68
    
        Ненавижу 1С гуру 24.07.14✎ 11:09 | 
        (66) Pow это степень     | |||
| 69
    
        mzelensky 24.07.14✎ 11:13 | 
        (67) в попытке есть условие?     | |||
| 70
    
        sda553 24.07.14✎ 11:14 | 
        (69) Да, условие вида Если счетчикОшибок>0 в реализации оператора     | |||
| 71
    
        Ненавижу 1С гуру 24.07.14✎ 11:16 | 
        (69) в попытке есть поднятие исключения, условие на которое проверяется, заходить в ветвь Исключение или нет     | |||
| 72
    
        acsent 24.07.14✎ 11:17 | 
        (16) может сразу:
 х у @ | |||
| 73
    
        Asmody 24.07.14✎ 11:21 | 
        эту ссылку уже кидали? http://projecteuler.net/     | |||
| 74
    
        Ненавижу 1С гуру 24.07.14✎ 11:23 | 
        (73) первая же задача, а там надо программировать или математику использовать?     | |||
| 75
    
        sda553 24.07.14✎ 11:28 | 
        (73) интересные задачки, пощелкаем     | |||
| 76
    
        skunk 24.07.14✎ 11:35 | 
        а чего там интересного ... просто ради любопытства первую задачку прочитал ... там она из учебника для школьников 8 или 9 класса ...     | |||
| 77
    
        NikVars 24.07.14✎ 11:40 | 
        (0) Звиздец! Цель оптимизации кода какая?!     | |||
| 78
    
        Shurjk 24.07.14✎ 11:43 | 
        Учитывая что всего три числа, то применение хитрых алгоритмов здесь нецелесообразно. Тупая задача.     | |||
| 79
    
        mrDSide 31.07.14✎ 13:38 | 
        Бред. А не судьба обойти 1 раз все 3 числа, потом второй раз просто сравнить и вывести те которые равны максимальному?     | |||
| 80
    
        NS 31.07.14✎ 13:57 | 
        var a,m,i:integer;
 var s:string; begin read(a); m:=a; s:="1"; for i:=2 to 3 do begin read(a); if a=m then s:=s+","+chr(ord('0')+i) else if a>m then begin m:=a; s:=chr(ord('0')+i); end; end; writeln(s); end. | |||
| 81
    
        NS 31.07.14✎ 14:02 | 
        Виноват,
 var a,m,i:integer; var s:string; begin read(a); m:=a; s:='1'; for i:=2 to 3 do begin read(a); if a=m then s:=s+','+chr(ord('0')+i) else if a>m then begin m:=a; s:=chr(ord('0')+i); end; end; writeln(s); end. | |||
| 82
    
        mrDSide 01.08.14✎ 00:40 | 
        (80) (81) - ошибка. В условии вывести все максимальные числа.     | |||
| 83
    
        NS 03.08.14✎ 00:04 | 
        (82) В условии - вывести их порядковые номера.     | |||
| 84
    
        mrDSide 03.08.14✎ 22:14 | 
        (83) примечание: если числа одинаковые это должно быть учтено, если максимальных чисел 2 это тоже должно быть учтено.     | |||
| 85
    
        User_Agronom 03.08.14✎ 22:16 | 
        (3) Теорема Пифагора старше ;)     | |||
| 86
    
        NS 03.08.14✎ 22:17 | 
        (84) Ну и? У меня всё это учтено. Еще раз прочитай задание, и посмотри что у меня выводит.     | |||
| 87
    
        mrDSide 04.08.14✎ 13:03 | 
        (86) все верно, видимо поздно очень было.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |