Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Snaill
0 / 0 / 0
Регистрация: 27.04.2017
Сообщений: 6
1

Отсортировать слова в строке во возрастанию количества символов

20.02.2018, 21:52. Просмотров 440. Ответов 1
Метки нет (Все метки)

Дана строка, нужно отсортировать слова в строке во возрастанию количества символов и занести это в файл.
Изначальная строка находится в файле
Ниже мой код, но не пашет...., не могу понять ошибку

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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
.model small
.stack 100h
.data       
CR = 0Dh
LF = 0Ah
FileName db "sentence.txt","$"        
FDescr dw ?              
NewFile db "newfile.txt","$"                                         
FDescrNew dw ?                             
 
maxCount dw 0
char db 'a'
 
Buffer dw ?
String dw 40 dup(0)
index dw 0  
 
MessageError1 db CR, LF,  "File was`t opened!", "$"        
MessageError2 db CR, LF, "Error reading the file!", "$"
MessageError3 db CR, LF, "File was`t found!", "$"
MessageError4 db CR, LF, "File was`t created!", "$"
MessageError5 db CR, LF, "Error writing the file!", "$"
MessageEnd  db CR, LF, "Program was successfully finished!", "$"
 
dop dw ?
count dw '0'
crlf db 13,10,'$'
.code
start:
 
print_string macro
mov ah, 09h
int 21h
endm
 
 
 
 
 
mArrangeWordsInAscending macro source,target
local exit,first,second,third,start
push ax
push bx
push cx
push dx
start:
xor bx,bx
xor ax,ax
xor cx,cx
lea di,byte ptr source+2
inc count
mov cl,byte ptr source+1
first:  
mov bx,di
cld
mov al,' ' 
repne scasb
jne start
push di
push cx
sub di,bx
dec di
xor ax,ax
mov ax,di
cmp count,ax
je second
pop cx
pop di
jmp first
second:
mov cx,di
inc cx
xor ax,ax
mov al, byte ptr target+1
mov si,ax
lea di, target+si
mov si,bx
add target+1,cl
cld
rep movsb
pop cx
pop di
xor ax,ax
mov al, byte ptr target+1
cmp byte ptr source+1,al
jbe exit
jmp first
exit:
pop dx
pop cx
pop bx
pop ax
endm    
 
write macro srt
push ax
push dx
lea dx, str 
mov ah,09h
int 21h
pop dx
pop ax
endm
 
putdigit macro
local lput1
local lput2
local exx
 
push ax
push cx
push -1
mov cx,10
 
lput1:
xor dx,dx
mov ah,0
div cl
mov dl,ah
push dx
cmp al,0
jne lput1
mov ah,2h
 
lput2:
pop dx
cmp dx,-1
je exx
add dl,'0'
int 21h
jmp lput2
 
exx:
mov dl,' '
int 21h
pop cx
pop ax
endm
 
mov ax,@data
mov ds,ax
mov ah,3Dh
xor al,al
mov dx,offset FileName
xor cx,cx
int 21h
mov FDescr,ax
jnc M1
jmp Er1
 
CloseFile macro FileDescr
    mov ah, 3eh     ;закрытие файла                      
 mov bx, FileDescr 
 int 21h 
endm
 
 
M1:                                 
    mov ah,3ch
    xor cx,cx
    mov dx,offset NewFile
    int 21h    
    mov FDescrNew, ax                 ;дискриптор файла
    jnc M2                            ;eсли ошибок нет, продолжить   
    jmp Er3                           ;ошибка,файл не был создан
 
M2:                                
    mov ah,3fh
    mov bx,FDescr
    mov cx,1
    mov dx,offset Buffer
    int 21h                                
    jnc M3                                ;если ошибок нет,продолжить
    jmp Er2                               ;файл не был прочтён
    
M3:
    cmp ax,0
    je M4
    mov ax,Buffer
    mov bx,index
    mov String[bx],ax
    jmp M2
    
M4:     
mArrangeWordsInAscending String
    jnc M6
    jmp Er4  
 
    
Er1:    ;файл не был найден
    cmp ax, 02h
    jne M5
    lea dx, MessageError3
    print_string
    jmp Exit
    
M5:     ;файл не был открыт
    lea dx, MessageError1
    print_string
    jmp Exit
    
Er2:    ;файл не был прочтен
    lea dx, MessageError2
    print_string
    jmp Exit 
    
Er3:   ;файл не был создан
    lea dx, MessageError4
    print_string
    jmp Exit
    
Er4:   ;ошибка при записи в файл
    lea dx, MessageError5
    print_string
    jmp Exit  
    
M6:
    CloseFile FDescr     ;функция закрытия файла
    CloseFile FDescrNew 
    
    lea dx, MessageEnd
    print_string
    jmp Exit  
   
    
Exit:
    mov ah, 07h  
    int 21h   
    mov ax, 4c00h
    int 21h
end start
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2018, 21:52
Ответы с готовыми решениями:

Отсортировать слова по возрастанию
Добрый день. Нужна помощь, есть задание: Дано 8 слов по 6 символов. В начале каждого слова записан...

Массив.1преобразовать с обратной последовательностью символов. 2 отсортировать по возрастанию,предварительно возведя в квадрат
Здравствуйте!по информатике задали вот такие задачи : произвольный массив А={а0,а1,...аn} 1....

Сортировка символов в строке по возрастанию
Здравствуйте. Я пытаюсь который день сделать сортировку символов в строке при помощи цепочных...

Подсчет количества символов в строке
Как сделать чтобы считались символы в строке data segment string db 100,100 dup ('$') data...

Подсчет количества символов в строке
На асеблере только начал программировать. Как подсчитать колличество символов строке?

1
ФедосеевПавел
Модератор
5147 / 2731 / 1097
Регистрация: 01.02.2015
Сообщений: 8,877
Записей в блоге: 1
21.02.2018, 00:01 2
"Не пашет" - это насколько мелкая борозда. Может тягло сменить или плуг?

Сможете описать проблему без терминов сельского хозяйства?

Добавлено через 37 секунд
И почему тема в разделе Windows, хотя исходник для DOS?

Добавлено через 5 минут
Опишите формат строки (чем разделены слова).

Я бы решал задачу без перемещения слов в строке - создал бы массив структур из двух полей (указатель на начало слова и длина слова). Этот массив отсортировал по полю длина слова, а потом выводил бы слова в файл, добавляя разделители.

Добавлено через 1 час 54 минуты
Когда-то решал подобную задачу на Pascal
Pascal
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
{.$define Debug}
PROGRAM SortWords;
TYPE
  TRecWordProperty = RECORD
    StartPos  : Integer;
    WordLen   : Integer;
  END;
  TArrWordProperty = array [1..128] of TRecWordProperty;
PROCEDURE ProcessStr(VAR SStr, DStr : String);
VAR
  m         : TArrWordProperty;
  WordCount : Integer;
  i, j      : Integer;
  MinLen    : Integer;
  MinIndex  : Integer;
BEGIN
  WordCount:=0; {количество слов в строке}
  i:=1; {текущая позиция в анализируемой строке}
  while i<=Length(SStr) do begin
    {ищем первую букву слова}
    while (i<=Length(SStr)) do begin
      if (SStr[i] =  ' ')
        then Inc(i)
        else Break;
    end;
    if i>Length(SStr)
      then Break;
    Inc(WordCount);
    m[WordCount].StartPos:=i;
    {теперь просматриваем слово пока не закончится строка или
     не начнутся ограничители слов}
    while (i<=Length(SStr)) do
      if (SStr[i] = ' ')
        then Break
        else Inc(i);
    m[WordCount].WordLen:=i-m[WordCount].StartPos;
  end;
{$IFDEF Debug}
  for i:=1 to WordCount do
    WriteLn(i:2,'. "',copy(SStr, m[i].StartPos, m[i].WordLen),'"');
{$ENDIF}
  DStr:='';
  for i:=1 to WordCount do begin
    MinLen:=m[i].WordLen;
    MinIndex:=i;
    for j:=i+1 to WordCount do begin
      if MinLen<m[j].WordLen
      then begin
        MinLen:=m[j].WordLen;
        MinIndex:=j;
      end;
    end;
    if i<>1 then DStr:=DStr+' ';
    with m[MinIndex] do
      DStr:=DStr+copy(SStr, StartPos, WordLen);
    {тут можно сделать обмен, но массив нам дальше не понадобится}
    if i<>MinIndex
    then begin
      m[MinIndex].WordLen :=m[i].WordLen;
      m[MinIndex].StartPos:=m[i].StartPos;
    end;
  end;
END;
 
VAR
  s,
  SNew  : String;
BEGIN
  WriteLn('Input string:');
{$IFDEF Debug}
  s:='один два три четыре пять шесть семь восемь девять a';
  WriteLn(s);
{$ELSE}
  ReadLn(s);
{$ENDIF}
  ProcessStr(s, SNew);
  WriteLn(SNew);
END.
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2018, 00:01

Подсчет количества разных символов в строке
доброго времени суток нужно написать такую программу : &quot;подсчет количества разных символов в...

Подсчёт количества повторений символов в строке
Подскажите , почему не работает код? Ввожу строку , ввожу символ, проверяю сколько раз он...

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


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

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

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