83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
|||||||||||
1 | |||||||||||
Найти второе по величине четное число в линейном массиве09.05.2015, 12:18. Показов 1269. Ответов 15
Метки нет (Все метки)
Найти второе по величине четное число в линейном массиве
элементы массива - знаковые целые числа размером в слово (не менее 10) ) – должны вводиться с клавиатуры. И ещё главное чтобы не менялись числа в массиве поэтому код немного странноват Но иногда появляются ошибки например если все числа одинаковые Пример правильной работы программы: Исходный массив : 1 2 3 4 0 5 Ответ: 2 Вот что то наваял)
попробуйте забагать если получится напишите какие числа пробовали И отпишите как улучшить программу если у кого есть какие-нибудь соображения И если у кого будет интерес просмотреть код МОЖНО ЛИ СДЕЛАТЬ ТАМ ГДЕ У МЕНЯ САМАЯ ОСНОВНАЯ ЧАСТЬ ЧТО БЫ ОБОЙТИСЬ БЕЗ РЕГИСТРОВ BP ибо говорят что BP используют только для стека
0
|
09.05.2015, 12:18 | |
Ответы с готовыми решениями:
15
В массиве найти второе по величине число В массиве найти второе по величине число Найти в массиве второе по величине число В массиве A[n] найти второе по величине число |
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
||||||||||||||||||||||||||
09.05.2015, 15:19 | 3 | |||||||||||||||||||||||||
Часто используют для стека. Но это-же не значит, что его нельзя использовать иначе. Пока ты не адресуешься по BP косвенно - это регистр, как регистр. А вот косвенно - он, да, адресует по умолчанию в сегменте SS.
Добавлено через 6 минут
Добавлено через 30 минут Так некорректный у тебя алгоритм. Первый цикл после метки endin. Ты запихиваешь в BP второе по порядку четное число в массиве. Если четных чисел меньше двух идешь на ошибку. Второй цикл - ты ищещь четное, не равное найденному в первом цикле. Если не найдешь, то идешь на ошибку. Вывод - если все четные числа одинаковые и хоть сколько их, у тебя обязательно уйдет на ошибку. Добавлено через 20 минут Мысли проще. Массив будем просмотривать только ОДИН РАЗ ! У тебя два флага состояния : Флаг_1 - нашли первое четное число. Флаг 2 - нашли второе четное число. Код
Флаг1 = ЛОЖЬ Флаг2 = ЛОЖЬ Цикл: ЧИСЛО = очередной_элемент_массива Если ЧИСЛО нечетно, то GOTO Конец_цикла Если Флаг 1 = ЛОЖЬ, то НАИБОЛЬШЕЕ = ЧИСЛО Флаг_1 = ПРАВДА GOTO Конец_цикла Если Флаг 2 = ЛОЖЬ, то Если ЧИСЛО <= НАИБОЛЬШЕЕ ИСКОМОЕ = ЧИСЛО в противном случае ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО Флаг_2 = ПРАВДА GOTO Конец_цикла Если ЧИСЛО > НАИБОЛЬШЕЕ ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО GOTO Конец_цикла Если ЧИСЛО > ИСКОМОЕ ИСКОМОЕ = ЧИСЛО Конец_цикла: LOOP Цикл Если Флаг_2 = ЛОЖЬ, то GOTO на ошибку Печатаем ИСКОМОЕ И еще :
Короче, простые правила : CMP - это то-же самое, что SUB, только результат не пишется никуда. Изменяются только флаги. TEST - это то-же самое, что AND, только результат не пишется никуда. Изменяются только флаги. Добавлено через 3 минуты В свете этого :
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
||||||
09.05.2015, 15:42 [ТС] | 4 | |||||
я имел ввиду что мне важно было единица там или что то иное
забыл наверое правда сперва указать xor bp, bp и это мне нужно было для этого фрагмента кода:
правильно ибо мне нужно найти второе по величине чётное число а следовательно если одно чётное то не будет результата Добавлено через 33 секунды так да я это специально подгонял.... Добавлено через 23 секунды тобишь пользователь некоорректо вводит массив
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
09.05.2015, 15:43 | 5 |
К этому циклу претензий нет. Если в массиве два и более четных и все одинаковые, то ошибка будет на следующем цикле.
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
|
09.05.2015, 15:44 [ТС] | 6 |
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
09.05.2015, 15:44 | 7 |
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
|
09.05.2015, 15:47 [ТС] | 8 |
не додумал как в один уместить...
Добавлено через 2 минуты так то да но это же не логично .... 2=2 а если второе по величине следовательно оно не <> друг другу.... но конечно можно так как и вы сделать чисто выйти сразу на ответ указав это чётное число в качестве ответа
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
||||||
09.05.2015, 16:03 | 9 | |||||
К слову после исполнения каждой инструкции процессора в слове состояния процессора выставляется или нет флажок Parity. И у него совсем иной смысл. Так-что за словом Parity в мире ассемблера закреплен иной смысл. Смысл паритета, а не четности.
Это в русском языке четность - это четный или нечетный. А в английском - это even или odd. Чтобы не путать с Parity в смысле паритета пишут в комментариях "Even or Odd ?" "Is it even ?" и т.д. Добавлено через 1 минуту Ну в математическом смысле у массива одинаковых чисел есть и наибольшее значение и наименьшее. Просто тот, кто давал тебе задание, наверняка мыслит именно так. Добавлено через 8 минут Ну доработай мой алгоритм так :
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
|||||||||||
09.05.2015, 19:29 [ТС] | 10 | ||||||||||
ЧТО означает в вашем псевдокоде ИСКОМОЕ?
ЧТО означает в вашем псевдокоде ЧИСЛО? Добавлено через 48 минут ПОХОДУ ПОНЯЛ ИСКОМОЕ ТО ЧТО СЛЕДУЕТ ОТЫСКАТЬ А ЧИСЛО ЭТО ТЕКУЩЕЕ ЧИСЛО В МАССИВЕ Добавлено через 36 минут пытался разобраться с предложенным вами алгоритмом да недопонял.... гляньте может чё намудрил...
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|||||||||||
09.05.2015, 21:55 | 11 | ||||||||||
Вот это и значит.
Добавлено через 57 секунд Вот это : Добавлено через 29 минут Попробую объяснить доступно : Добавлено через 5 минут У тебя одна ошибка :
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
||||||
11.05.2015, 18:04 [ТС] | 12 | |||||
работает казалось бы на ура! но в ходе долгих проверок штук 20 я обнаружил ЧТО при задаче такого массива 2, 2, -2, -2 считает что числа одинаковые и не выдаёт соответственно результата
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
11.05.2015, 20:34 | 13 |
Это я затупил. Если ИСКОМОЕ = НАИБОЛЬШЕЕ, то два наибольших целых одинаковы, а не все они. Убрать эту строчку из алгоритма.
Получается, что это я - тормоз. Добавлено через 16 минут Код
Флаг1 = ЛОЖЬ Флаг2 = ЛОЖЬ Флаг_РАЗЛИЧНЫ = ЛОЖЬ <- добавление Цикл: ЧИСЛО = очередной_элемент_массива Если ЧИСЛО нечетно, то GOTO Конец_цикла Если Флаг 1 = ЛОЖЬ, то НАИБОЛЬШЕЕ = ЧИСЛО Флаг_1 = ПРАВДА GOTO Конец_цикла Если ЧИСЛО != НАИБОЛЬШЕЕ, то Флаг_РАЗЛИЧНЫ = ПРАВДА <- добавление Если Флаг 2 = ЛОЖЬ, то Если ЧИСЛО <= НАИБОЛЬШЕЕ ИСКОМОЕ = ЧИСЛО в противном случае ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО Флаг_2 = ПРАВДА GOTO Конец_цикла Если ЧИСЛО > НАИБОЛЬШЕЕ ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО GOTO Конец_цикла Если ЧИСЛО > ИСКОМОЕ ИСКОМОЕ = ЧИСЛО Конец_цикла: LOOP Цикл Если Флаг_2 = ЛОЖЬ, то GOTO на ошибку Если Флаг_РАЗЛИЧНЫ = ЛОЖЬ, то напечатать "Все четные одинаковы" <- добавление Печатаем ИСКОМОЕ Кстати, метафизический вопрос. Даны три числа : 2 2 -2. Какое из них второе по величине ? По моему алгоритму 2. Но ведь можно считать, что и -2. Тогда алго надо переделать.
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
|
11.05.2015, 21:07 [ТС] | 14 |
должно по идее быть -2
ксать тот алгоритм который я кидал рабочий в этом плане Добавлено через 2 минуты вот этот новый код который с он работает в этом плане? или всё же придётся алгоритм менять?
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
|
|
11.05.2015, 21:40 | 15 |
Придется менять. Щас поменяю. Я написал математически корректный алгоритм. А ты хочешь построенный на бытовой логике. Впрочем, хозяин-барин.
Добавлено через 9 минут А там можно только одну строчку вставить (отталкиваясь от того, что ты уже написал) и все будет чики-пики Код
Флаг1 = ЛОЖЬ Флаг2 = ЛОЖЬ Цикл: ЧИСЛО = очередной_элемент_массива Если ЧИСЛО нечетно, то GOTO Конец_цикла Если Флаг 1 = ЛОЖЬ, то НАИБОЛЬШЕЕ = ЧИСЛО Флаг_1 = ПРАВДА GOTO Конец_цикла Если ЧИСЛО = НАИБОЛЬШЕЕ, то GOTO Конец_цикла <- вставить Если Флаг 2 = ЛОЖЬ, то Если ЧИСЛО <= НАИБОЛЬШЕЕ ИСКОМОЕ = ЧИСЛО в противном случае ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО Флаг_2 = ПРАВДА GOTO Конец_цикла Если ЧИСЛО > НАИБОЛЬШЕЕ ИСКОМОЕ = НАИБОЛЬШЕЕ НАИБОЛЬШЕЕ = ЧИСЛО GOTO Конец_цикла Если ЧИСЛО > ИСКОМОЕ ИСКОМОЕ = ЧИСЛО Конец_цикла: LOOP Цикл Если Флаг_2 = ЛОЖЬ, то GOTO на ошибку Печатаем ИСКОМОЕ Тут ошибка будет означать, что нету минимум двух разных четных. Добавлено через 9 минут Т.е. тут я только одну строчку вставил, помеченную "<- вставить" и после цикла условие ухода на ошибку оставил единственное. Более ничего не трогал. Добавлено через 4 минуты Вот эта строчка, которую я вставил, будет гарантировать, что ИСКОМОЕ не будет равно НАИБОЛЬШЕМУ. Числа уже равные текущему НАИБОЛЬШЕМУ будут отбрасываться, а значит текущее ИСКОМОЕ будет наибольшим из всех меньших его по величине чисел.
1
|
83 / 19 / 5
Регистрация: 01.02.2015
Сообщений: 655
|
||||||
11.05.2015, 22:14 [ТС] | 16 | |||||
всё работает на ура (тестил раз 30)
вот код (а можно было бы его ещё как то усовершенствовать в плане быстродействия наверное это уже глупости но чисто ради "спортивного интереса"
0
|
11.05.2015, 22:14 | |
11.05.2015, 22:14 | |
Помогаю со студенческими работами здесь
16
В массиве найти второе по величине число Найти в массиве второе по величине число Функция: в массиве найти второе по величине число Составить программу, которая в массиве A[n] находит второе по величине число Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |