|
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) все верно, видимо поздно очень было.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |