0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 10
1

Слияние двух упорядоченных списков с сохранением алфавитного порядка

11.11.2017, 02:18. Показов 1727. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача (TASM): Провести слияние двух упорядоченных списков вида "Фамилия И.О." с сохранением алфавитного порядка. Исходные и конечный списки вывести на экран.

Помогите найти ошибки: кое-как все работает только с такими списками фамилий, если начать менять содержимое массивов, все перестает работать вообще(( А нужно, чтобы программа могла работать с любыми списками.
+ 1-я фамилия второго массива (SBOROV A.V) выводится с двойной буквой "B"
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
DOSSEG
.model TINY                        
.data
 
array db "IVAKIN   V.Y.",10,13
      db "PETRIN   R.A.",10,13
      db "KOTOVSKY A.A.",10,13
      db "KORKIN   V.G.",10,13
      db "ANTONOVA A.S.",10,13
      db "SYCHEV   D.Y.",10,13
      db "KOLMAKOV I.V.",10,13
      db "KOLYADOV  S.V",10,13  
      db "MOSTOVIN A.V.",10,13
      db "SIDOROV  I.V.",10,13   
      db "$"
      
array2 db "SBOROV  A.V.",10,13
      db "AKINSHIN I.V.",10,13
      db "MALEVICH V.A.",10,13
      db "$"                                                                                       
 
string db "---------------------$",10,13
.code
 
; swap funtion (перестановка строк)
swap:
pop dx
pop bx ; bx = &array
push dx
mov cx, 15d ; cx = num of loop
for:
push bx
add bx, cx
dec bx
mov al, [bx] ; ax = first word
mov dl, [bx+15d] ; dx = second word
mov [bx], dl
mov [bx+15d], al
pop bx
loop for
ret ; end of swap function
 
start:
mov ax, @data
mov ds, ax
 
mov bx, offset array
mov di, offset array2
 
add bx,150d ; конец массива
 
mov dx,[di] ; dx = word of array2
mov [bx], dx  ; [bx]=  last word of array
 
;print new list
mov dx, offset array
mov ah, 9h
int 21h   
 
 mov dx, offset string
 mov ah, 9h
 int 21h   
 
mov cx, 12d
loop2:
push cx ; поместить в стек
mov bx, offset array
 
mov cx, 12d
mov di, offset array 
mov si,14
loop1:
 
mov al, [bx+15d]
mov ah, [bx]
cmp al, ah ; сравниваем количество букв
je m1      ;  если равно
cmp al, ah ; сравниваем количество букв
ja inc_str ; если больше
mov bx,di
push bx
push cx
push bx
call swap
pop cx
pop bx
mov di,bx
jmp inc_str  
  m1: 
  add bx,1d
  sub si,1
  cmp si,0
  jne loop1
  
  jmp inc_str
inc_str:
mov bx,di
add bx, 15d
mov di,bx
loop loop1
 
pop cx
loop loop2
 
mov dx, offset array
mov ah, 9h
int 21h  
mov ah, 4ch
int 21h
 
end start

Скриншот во вложении.
Миниатюры
Слияние двух упорядоченных списков с сохранением алфавитного порядка  
0
11.11.2017, 02:18
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2017, 02:18
Ответы с готовыми решениями:

Слияние двух упорядоченных списков
Всем привет! Можете подсказать как делать? Условие: Провести слияние двух упорядоченных списков. В качестве элементов первого списка...

Слияние двух упорядоченных списков в один упорядоченный
Даны два списка упорядоченные по не убыванию.Объединить их в третий список упорядоченный по не убыванию. Не могу разобраться с процедурой...

Слияние двух односвязных упорядоченных по неубыванию линейных списков
Разработайте программу слияния двух односвязных упорядоченных по неубыванию линейных списков в один упорядоченный список.

6
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6163 / 2400 / 398
Регистрация: 29.07.2014
Сообщений: 3,144
Записей в блоге: 4
11.11.2017, 09:12 2
Цитата Сообщение от Angelica Посмотреть сообщение
string db "---------------------$",10,13
..доллар должен быть в самом конце, а остальное выводит-же. В чём проблема?
Assembler
1
string db "---------------------",10,13,'$'
0
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 10
11.11.2017, 14:47  [ТС] 3
Проблема в следующем: при изменении списков фамилий, например, так:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
array db "ANTONOVA A.S",10,13
      db "BORISOV   R.A.",10,13
      db "KOLMAKOV I.V.",10,13
      db "KORKIN   V.G.",10,13
      db "KOTOVSKY A.A.",10,13
      db "MOSTOVIN A.V.",10,13
      db "PETRIN   R.A.",10,13
      db "SIDOROV  I.V.",10,13  
      db "SYCHEV   D.Y.",10,13
      db "ZLOBIN   V.Y.",10,13 
      db "$"
      
array2 db "AKINSHIN I.V.",10,13
      db "MALEVICH V.A.",10,13
      db "SBOROV  A.V.",10,13
      db "$"
программа нормально не сортирует в алфавитном порядке (скриншот ниже). Фамилия BORISOV выводится как ORISOV , а буква B от нее присоединяется к фамилии KOLMAKOV (т.е. выводит BKOLMAKOV).
Т.е. программа работает неправильно, где-то ошибка
0
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 10
11.11.2017, 14:48  [ТС] 4
Скриншот
Миниатюры
Слияние двух упорядоченных списков с сохранением алфавитного порядка  
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6163 / 2400 / 398
Регистрация: 29.07.2014
Сообщений: 3,144
Записей в блоге: 4
11.11.2017, 15:00 5
Цитата Сообщение от Angelica Посмотреть сообщение
mov cx, 15d ; cx = num of loop
поскольку СХ=15, то вам нужно выравнивать все поля на 15 символов - 13 для фамилии и плюс 2 на перевод строки 13,10. Вы вводите меньше, поэтому всё идёт наперекосяк. Дополните пробелами фамилие до 13-символов, чтобы выравнить строй
1
0 / 0 / 0
Регистрация: 03.05.2017
Сообщений: 10
11.11.2017, 15:36  [ТС] 6
Проверила пробелы, с фамилией BORISOV теперь все хорошо, но у 1-й фамилии второго массива (AKINSHIN I.V.) все равно удваивается вторая буква (получается AKKINSHIN I.V.). Последние 2 фамилии второго массива не встают в итоговый список в алфавитном порядке, а выводятся в самом начале итогового списка (скриншот во вложении).
Миниатюры
Слияние двух упорядоченных списков с сохранением алфавитного порядка  
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8569 / 4416 / 1656
Регистрация: 01.02.2015
Сообщений: 13,719
Записей в блоге: 9
11.11.2017, 23:46 7
Angelica, реальным выходом здесь будет разделение слияния на две подчасти:
1) цикл выбора следующего элемента из двух списков.
2) процедура сравнения элементов
Т.е. разделение собственно алгоритма слияния от алгоритма сравнения. Это резко упростит анализ.

Я привык подобные алгоритмы записывать на каком нибудь Pascal или C. А потом строки этого алгоритма становятся комментариями к асм-исходнику.

И ещё, не могу понять, где формируется итоговый список.

Еще предложил бы другой формат хранения списка.
Есть два варианта:
Каждый элемент завершается 0, в конце списка расположен ещё один 0.
Assembler
1
2
3
4
5
6
7
8
9
10
11
array db "ANTONOVA A.S", 0
      db "BORISOV R.A.", 0
      db "KOLMAKOV I.V.", 0
      db "KORKIN V.G.", 0
      db "KOTOVSKY A.A.", 0
      db "MOSTOVIN A.V.", 0
      db "PETRIN R.A.", 0
      db "SIDOROV  I.V.", 0
      db "SYCHEV D.Y.", 0
      db "ZLOBIN V.Y.", 0
      db 0
Сами строки располагаются где-то в памяти, а списки представляют из себя ссылки на элементы. Тогда новый список будет представлять из себя массив ссылок (указателей, адресов) на неизменившие положение строки.

Добавлено через 4 минуты
Т.е. мне кажется, что ошибка в вашей программе из-за невнятного разделения элементов в списках (формата списков). И из-за неполного критерия сравнения.

В общем предлагаю сначала реализовать на С, а потом транслировать в ассемблер.
Пример подобного подхода при реализации какого-то алгоритма сортировки Программа для сортировки любого массива
Сначала найдена реализация на С, а потом она аккуратно транслирована на асм.
И вам рекомендую пойти по этому пути.
0
11.11.2017, 23:46
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2017, 23:46
Помогаю со студенческими работами здесь

Слияние упорядоченных списков
Даны два упорядоченных по возрастанию числовых списка. Объединить их с сохранением упорядоченности. Пример: (1 2 5 6 11) и (-1 0 3 4 7...

Слияние упорядоченных списков в третий (найдите ошибку)
Добрый вечер , возникла сложность с решением задачи : Слияние упорядоченных списков в третий. Даны два списка L1 и L2. Считая, что...

Слияние двух упорядоченных массивов.
Элементы каждого из массивов X и Y упорядочены по не убыванию. Объединить элементы этих двух массивов в один массив Z так, чтобы они снова...

Слияние двух упорядоченных массивов
Задача: Даны упорядоченные массивы a и b из x и y элементов соответственно. Нам требуется сформировать массив с, состоящий из элементов...

Слияние двух упорядоченных файлов
Здравствуйте.Помогите пожалуйста решить задачу: Создать два файла А и В из целых чисел. Файл А  отсортировать по возрастанию;...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Микросервис с нуля на Go с Kafka
stackoverflow 12.02.2025
Когда я впервые столкнулся с необходимостью разделить монолитное приложение на микросервисы, передо мной встал вопрос выбора правильных технологий и подходов. После долгих экспериментов с различными. . .
Микросервис с нуля на C# с RabbitMQ
stackoverflow 12.02.2025
Переход от монолитной архитектуры к микросервисной - это не просто модное веяние, а закономерный этап эволюции программных систем. В отличие от монолита, где все компоненты тесно связаны между собой. . .
Docker для начинающих
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения все чаще возникает необходимость быстро и надежно разворачивать приложения в различных средах. Разработчики постоянно сталкиваются с проблемой. . .
Создание бота для Телеграм на C#
stackoverflow 12.02.2025
В современном мире корпоративных коммуникаций Telegram-боты становятся незаменимым средством автоматизации бизнес-процессов и взаимодействия с сотрудниками. Как создать такого бота, который сможет. . .
Операторы сравнения (== и ===) в JavaScript
hw_wired 12.02.2025
JavaScript предоставляет два основных оператора сравнения - оператор нестрогого равенства (==) и оператор строгого равенства (===). На первый взгляд они могут показаться очень похожими, но их. . .
Определение адреса, откуда репозиторий Git был клонирован
hw_wired 12.02.2025
Система контроля версий Git хранит всю информацию о репозитории в специальной директории . git, включая данные об удаленных источниках. Эта информация необходима для синхронизации изменений между. . .
Объединение нескольких коммитов Git в один
hw_wired 12.02.2025
Представьте, что вы работаете над новой функциональностью и создали десяток небольших коммитов: исправление опечатки, форматирование кода, добавление комментариев, реализация основной логики. Каждый. . .
Как добавить локальную ветку в удалённый репозиторий Git
hw_wired 12.02.2025
Локальная ветка в Git - это изолированная линия разработки, существующая только на вашем компьютере. Представьте себе дерево с множеством веток - каждая ветка может расти в своем направлении, не. . .
Статическое отражение в C++
stackoverflow 12.02.2025
Статическое отражение представляет собой мощный механизм, позволяющий программам анализировать и манипулировать своей собственной структурой во время компиляции. Эта возможность открывает. . .
C++ в 21 веке - Бьярне Страуструп
stackoverflow 12.02.2025
В современном мире разработки программного обеспечения C++ продолжает оставаться одним из ключевых языков программирования, несмотря на свой солидный возраст - более 45 лет с момента создания. За это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru