0 / 0 / 0
Регистрация: 11.07.2016
Сообщений: 1
|
|
1 | |
В массиве удалить элементы, меньшие среднего арифметического элементов массива11.07.2016, 14:17. Показов 1597. Ответов 13
"В массиве удалить элементы, меньшие среднего арифметического элементов массива."
Надо написать самым простым способом
0
|
11.07.2016, 14:17 | |
Ответы с готовыми решениями:
13
Расчет СА (среднего арифметического) отрицательных элементов массива. Заменить минимальный элемент в массиве на СА Заменить все элементы, значение которых меньше среднего арифметического всех элементов массива на нулевые Emu8086 элементы больше среднего арифметического удалить Заменить четные по значению элементы на значение среднего арифметического всех элементов массива |
Прощай, Мир!
1672 / 830 / 253
Регистрация: 26.05.2012
Сообщений: 3,056
|
|
11.07.2016, 19:24 | 2 |
начни писать тогда и помощь будет..
0
|
Модератор
5272 / 4054 / 1389
Регистрация: 30.07.2012
Сообщений: 12,429
|
|
12.07.2016, 18:20 | 3 |
bodi_124
0
|
183 / 121 / 26
Регистрация: 18.05.2015
Сообщений: 509
|
|
13.07.2016, 12:34 | 4 |
bodi_124, наверняка методичка есть?
0
|
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 914
|
||||||
16.07.2016, 18:35 | 5 | |||||
Изучаю ассемблер. Решил попробовать решить данную задачу. Вот что получилось:
0
|
197 / 89 / 15
Регистрация: 10.07.2016
Сообщений: 146
|
||||||
16.07.2016, 22:03 | 6 | |||||
Твоё решение более менее близко к оптимальному для данной задачи. Однако пройдёмся по пунктам:
1. строка 16 - обычно для этого используют XOR 2. строка 18 - указатель на массив лучше поместить в SI, открыв таким образом доступ к LODSW и заменив им строки 21,23 3. Массив объявлен как байтовый, однако в первом цикле идёт чтение двух байт (строка 21), а указатель изменяется на 1 байт (строка 23) 4. Чуть не забыл - строка 19 movzx зачем? И неплохо бы после загрузки размера массива обнулить AH (если массив байтовый) и тогда сложение слов в строке 27 имеет смысл 5. Строка 26 - эта строка приведёт к ошибке в расчётах, если сумма массива выйдет за пределы 255. Опасаться переполнения при делении в данном случае не стоит, т.к. даже если будут максимальные числа - 255 все 10 раз, получится 255*10 и если это разделить на 10 выход за пределы 255 не произойдет. В общем случае использования операции деления легко понять когда возможно переполнение - если старшая половина делимого равна или больше делителя. 6. Строка 28 - коммент не верен, т.к. целый ответ в AL, остаток AH и в строке 32 сравнение идёт правильно с AL, т.е. опять же массив байтовый, однако в строке 9 затирка слова. И кстати строка 33 переход знаковый, т.е. массив байтовый со знаком в старшем бите? Тогда нужны команды сложения и деления знаковые. 7. Строки 8-12 было бы лучше убрать и сделать
9. Ради интереса попробуй составить алгоритм без изменения указателя в массиве - строки 23,31, или с помощью mmx команд.
1
|
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 914
|
|
16.07.2016, 22:47 | 7 |
Круто. Спасибо за детальное объяснение. Попробую ответить на ваши некоторые пункты. Насчет пункта 1) эту штуку знал, только подзабыл про нее. Я так понимаю что здесь разница в байтах?
Добавлено через 17 минут по пункту 2) читал что для массива используют индексные регистры SI, DI, но так как тот ресурс по которому я читаю более про них не говорил, поэтому у меня сложилось впечатление что их используют, когда не хватает регистров общего назначения. А про LODSW не слышал, надо почитать.
0
|
Эксперт Hardware
|
||||||
17.07.2016, 07:14 | 8 | |||||
Senarist, совсем необязательно прибавлять к среднему 1. Можно просто уточнить условие проверки, типа меньше/равно(JBE) и всё. И почитай про строковые команды, которые удобны тем, что не нужно постоянно двигать указатели. Эти команды сами их сдвигают. Вот тебе краткое описание:
1
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
|
17.07.2016, 16:34 | 9 |
Эта задача вообще из области параноидальной шизофрении.
Во-1, для вычисления среднего необходимо задействовать FPU. (Если сами данные в массиве не FP, то можно и не задействовать, а смтреть по остатку) Во-2, как задан массив? По указателю? Тогда как вычисляется его размер/окончание? Какой тип данных массива? И в-3, что такое "удалить элементы массива"? Шилом пробить ячейки на кристалле ОЗУ?
0
|
Эксперт Hardware
|
|
17.07.2016, 19:45 | 10 |
Ну правильно.. Щас доверили книжки писать всяким Чикатило, которые их пишут нито под-кайфом, нито спросони. Это уже вошло в привычку: всё что не оговорено, можно подгонять под свои мысли, и добавлять отсебятину.
Короче, полная анархия
0
|
197 / 89 / 15
Регистрация: 10.07.2016
Сообщений: 146
|
|
18.07.2016, 21:03 | 11 |
Senarist, XOR используют из-за размера, но не всегда, т.к. он изменяет флаги.
Для работы с массивами можно использовать любые регистры, однако для определённых реализаций алгоритма удобнее ESI/EDI, для других реализаций лучше будут конструкции типа [EDX+ECX*4] и тп. На языках высокого уровня работа с массивами идёт в жестко заданных рамках, на асме полная свобода и даже само понятие массива носит исключительно абстрактный характер.
0
|
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 914
|
|
18.07.2016, 22:49 | 12 |
0
|
58 / 62 / 34
Регистрация: 14.03.2014
Сообщений: 914
|
|
21.07.2016, 17:38 | 13 |
А есть ли команда наподобие lodsb, только чтобы ни как для моего примера указатель "шел" с начала до конца, а наоборот с конца. (Занести в si адрес последнего элемента массива и идти к началу) ?
0
|
Эксперт Hardware
|
|
21.07.2016, 17:55 | 14 |
..установи флаг DF, командой STD
1
|
21.07.2016, 17:55 | |
21.07.2016, 17:55 | |
Помогаю со студенческими работами здесь
14
В массиве определить количество элементов меньших среднего арифметического значения Подсчитать количество элементов, которые больше среднего арифметического массива Числа, большие среднего арифметического, заменить на первое значение в массиве Подсчет среднего арифметического массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |