Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: i8080/8085/KP580
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Badwolf909
0 / 0 / 1
Регистрация: 06.03.2018
Сообщений: 21
1

Найти минимальное положительное число в последовательности чисел (n=14)

25.03.2018, 12:52. Просмотров 1278. Ответов 21
Метки нет (Все метки)

Вот есть код, не могу разобраться в чем ошибка.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
RD #40
WR 37
RD #14
WR 38
M3: RD @37
JS M1
WR 60
RD 37
WR 61
RD 38
WR 62
M2: RD @61
JS M4
SUB 60
JNS M2
RD @61
WR 60
M4: RD 61
ADD #1
WR 61
RD 62
SUB #1
WR 62
JNZ M2
M1: RD 37
ADD #1
WR 37
RD 38
SUB #1
WR 38 
JNZ M3 
WR 60 
OUT 
HLT
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2018, 12:52
Ответы с готовыми решениями:

ЭВМ Жмакина. В последовательности чисел длиной n=14 найти минимальное положительное число.
Помогите написать программу определения заданной характеристики последовательности чисел С1,...

ЭВМ Жмакина. Найти минимальное положительное число среди 14 элементов массива
Вот характеристика последовательности: Минимальное положительное число; n=14; Сделать нужно в...

Учебная ЭВМ. Минимальное положительное число
Здравствуйте, задание, найти минимально-положительное число, при данном коде 0 считается программой...

В массиве Z[1..N] каждое из чисел уменьшить на минимальное значение. Минимальное число в массиве не изменять.
Вот код задачи, минимум находит, но уменьшить не могу! Помогите дописать Uses crt; const n=10;...

В последовательности целых чисел определить минимальное положительное число
Напишите программу, которая в последовательности целых чисел определяет минимальное положительное...

21
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,732
25.03.2018, 19:17 2
А что здесь происходит? Что хранится в ячейках 37, 38, 60-62 ?
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
25.03.2018, 23:06 3
А ничего не происходит.
Пусть в ячейке 37 адрес, который назовем &x , а по этому адресу лежит не отрицательное значение x. Тогда

M3: RD @37 в аккамуляторе x
JS M1 не сработает
WR 60 в ячейке 60 значение x
RD 37 в аккамуляторе &x
WR 61 в ячейке 61 &x
RD 38
WR 62
M2: RD @61 в аккамуляторе x
JS M4 не сработает
SUB 60 вычитание x-x, результат 0
JNS M2 сработает и вечный цикл

Короче, ТС бред набросал и выложил, в надежде получить обратно правильное решение.
1
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,732
25.03.2018, 23:42 4
Badwolf909, к вам серьёзные претензии, что вы скопировали перечень команд наугад.

Вы можете набрать алгоритм на C/Pascal/BASIC ? Только сразу в адресной арифметике, чтобы не путаться в CompModel?
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 00:21 5
И тут вдруг возник очень нетривиальный вопрос. По идее корректная реализация алгоритма должна начаться с помещения в регистр c будущим результатом максимально-возможного положительного числа. А такое число суть 99999. Ну и как наиболее быстрым образом на этой уважаемой CompModel-е поместить в аккамулятор указанное число ? Вариант
RD #999
MUL #100
ADD #99
выглядит так, что хочется двинуть по монитору тапком.

Добавлено через 1 минуту
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Вы можете набрать алгоритм на C/Pascal/BASIC ?
Это где это будут сначала преподавать Си, а потом CompModel ?
0
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,732
26.03.2018, 01:06 6
В школе. Олимпиады для школьников с какого класса начинаются? С 10-11? Или раньше?

Можно искать в два этапа.
1. Поиск первого положительного. И установка флага, что такое число присутствует.
2. Если положительные присутствуют. Поиск или со следующего элемента или с начала.
Я уже так кому-то набирал. Но устал на 1-м шаге и предложил продолжить самостоятельно.

Добавлено через 1 минуту
http://www.cyberforum.ru/low-level/thread1698951.html
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 02:37 7
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
В школе.
После того как научились рисовать простейшие алгоритмы на настоящем Си снова учиться их рисовать на игрушечной CompModel ? Абсурд. Возможно, но только в обратном порядке.

Добавлено через 7 минут
Жмакинская ЭВМ специально заточена чтобы шестнадцатеричной системе не учить. Для какого-то облегченного курса инфоматики.

Добавлено через 20 минут
Вопрос. Можно ли короче :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
RD #0
WR 39
RD #40
WR 38
M1: RD @38
JS M3
JZ M3
WR 37
RD 39
JZ M2
SUB 37
JS M3
M2: RD 37
WR 39
M3: RD 38
ADD #1
WR 38
SUB #54
JNZ M1
RD 39
OUT
HLT
Добавлено через 19 минут
Можно.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
RD #0
WR 39
RD #40
WR R0
M1: RD @R0+
JS M3
JZ M3
WR 38
RD 39
JZ M2
SUB 38
JS M3
M2: RD 38
WR 39
OUT
M3: RD R0
SUB #54
JNZ M1
HLT
2
ФедосеевПавел
Модератор
4251 / 2340 / 940
Регистрация: 01.02.2015
Сообщений: 7,732
26.03.2018, 07:27 8
А загрузка в аккумулятор устанавливает флаги?
Из цитаты
Цитата Сообщение от Ethereal Посмотреть сообщение
M3: RD @37 в аккамуляторе x
JS M1 не сработает
понял, что не устанавливает.
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 12:55 9
Badwolf909, вот решение
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
rdi #99999 ;default - max value
WR R3 ;min positive number
RD #40
WR R0 ;R0 - address
RD #14
WR R2 ;R2 - count
 
M1: RD @R0+ ;a = number
JS M2 ;a<0 -> next
JZ M2 ;a==0 -> next
WR R4 ;R4 = current number
SUB R3 ;compare with min
JNS M1 ;>= -> next
MOV R3,R4 ;new min
M2:JRNZ R2,M1 ;next
RD R3 ;min
OUT 
HLT
Добавлено через 1 минуту
Цитата Сообщение от Ethereal Посмотреть сообщение
А такое число суть 99999. Ну и как наиболее быстрым образом на этой уважаемой CompModel-е поместить в аккумулятор указанное число
См выше
2
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 15:58 10
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
понял, что не устанавливает.
Загрузка в аккамулятор устанавливает флаги.

Добавлено через 23 минуты
Ну тогда так. Ищем указатель на минимальное положительное. Длина кода выходит в 16 слов.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RD #40
WR R0
WR R1
RD #14
WR R2
M1: MOV R3,R0
RD @R0+
JS M2
JZ M2
SUB @R1
JNS M2
MOV R1,R3
M2: JRNZ R2,M1
RD @R1
OUT
HLT
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 16:01 11
Ethereal, а если все будут неположительные?
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 16:06 12
Цитата Сообщение от liv Посмотреть сообщение
JNS M1 ;>= -> next
У тебя апшипка. Тут надо было на метку M2
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 16:09 13
Ethereal, разумеется,"апшипка"

Добавлено через 1 минуту
Badwolf909, в моем коде в 13 строке должно быть
Assembler
1
JNS M2 ;>= -> next
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 16:23 14
Цитата Сообщение от liv Посмотреть сообщение
Ethereal, а если все будут неположительные?
Если программа выдала по OUT неположительное число, то ни одного положительного не было. Все логично. Какой-то признак того, что ни одного положительного не было все равно должен быть. Типа признак ошибки.
А вот у тебя, если вдуматься, то получается, что если программа выдала на выход 99999, то неизвестно было ли это число единственным положительным или положительных вовсе не было.

Добавлено через 1 минуту
Хотя я поначалу хотел точно также сделать. В учебной задаче школьника, что так, что эдак. Лишь бы как нибудь.

Добавлено через 10 минут
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
А загрузка в аккумулятор устанавливает флаги?
Из цитаты
Сообщение от Ethereal
M3: RD @37 в аккамуляторе x
JS M1 не сработает
понял, что не устанавливает.
А, понял что имелось ввиду в этом вопросе. У меня было сказано.
Цитата Сообщение от Ethereal Посмотреть сообщение
Пусть в ячейке 37 адрес, который назовем &x , а по этому адресу лежит не отрицательное значение x.
Не отрицательное. И именно поэтому не сработает.
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 16:24 15
Ethereal, но все же лучше сделать вот так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
rdi #0
WR R3 ;min positive number (0 not found)
RD #40
WR R0 ;R0 - address
RD #14
WR R2 ;R2 - count
M1:RD @R0+ ;a = number
JZ M1
JNS M2 ;first positive found
JRNZ R2,M1 ;first
jmp M5
M2:WR R3 ;save first min
M3:RD @R0+ ;a = number
JS M4 ;a<0 -> next
JZ M4 ;a==0 -> next
WR R4 ;R4 = current number
SUB R3 ;compare with min
JNS M4 ;>= -> next
MOV R3,R4 ;new min
M4:JRNZ R2,M3 ;next
M5:RD R3 ;min
OUT 
HLT
2
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 16:52 16
Цитата Сообщение от liv Посмотреть сообщение
M1:RD @R0+ ;a = number
JZ M1
Ну опять-же ошибка. Прыжок должен быть не на M1, а на команду JRNZ в 10-й строке. Торопишься куда-то.
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 16:53 17
Ethereal, увы, так и есть Писал без компиляции
Сейчас все исправлю...
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 17:03 18
Так еще ошибка(и). Если положительное найдено, то общее число исполнений RD @R0+ у тебя будет не 14, а 15. Поскольку при выпрыгивании на метку M2 у тебя на одно JRNZ придется два RD @R0+ . В итоге ты прочтешь один элемент за массивом. И еще случай когда первое положительное было последним в массиве надо обработать особо, поскольку в этом случае второй цикл вообще крутить нельзя.
0
liv
1144 / 931 / 196
Регистрация: 07.10.2015
Сообщений: 3,011
Завершенные тесты: 1
26.03.2018, 17:07 19
Лучший ответ Сообщение было отмечено Badwolf909 как решение

Решение

Ethereal, Вот: Все учтено
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
rdi #0
WR R3 ;min positive number (0 not found)
RD #40
WR R0 ;R0 - address
RD #14
WR R2 ;R2 - count
 
;search first min
M1:RD @R0+ ;a = number
JZ M2
JNS M3 ;first positive found
M2:JRNZ R2,M1 ;first
jmp M5
 
;save 
M3:WR R3 ;save first min
 
;other numbers loop
M4:JRNZ R2,M6 ;search next min
 
;finish
M5:RD R3 ;min
OUT 
HLT
 
;get next number
M6:RD @R0+ ;a = number
JS M4 ;a<0 -> next
JZ M4 ;a==0 -> next
WR R4 ;R4 = current number
SUB R3 ;compare with min
JNS M4 ;>= -> next
MOV R3,R4 ;new min
JMP M4 ;next
0
Ethereal
5496 / 1948 / 255
Регистрация: 17.02.2013
Сообщений: 2,895
26.03.2018, 17:16 20
Ну во. Еще еще первое RDI #0 заменить на RD #0 чтобы сэкономить слово, то выйдет красота с перевернутым циклом. Можно перед преподавателем пофорсить
0
26.03.2018, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.03.2018, 17:16

Найти в последовательности минимальное положительное число
Найти в последовательности минимальное положительное число

Определить минимальное положительное число в данной последовательности.
Вводится последовательность ненулевых чисел, завершаемая нулем. Определить минимальное...

В последовательности случайных чисел найти минимальное и максимальное число в каждой последовательности(без массивов)
Очень нужна помощь! В последовательности случайных чисел найти минимальное и максимальное число...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru