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

Ввести строку С, определить чего в строке больше цифр, букв или знаков пунктуации

11.06.2018, 11:24. Просмотров 987. Ответов 13
Метки нет (Все метки)

Сделать программу на ассемблере.
Задание:
Ввести строку С,определить чего в строке больше цифр,букв или знаков пунктуации.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2018, 11:24
Ответы с готовыми решениями:

Дана последовательность символов, заканчивающихся ‘!’. Определить каких символов больше: маленьких латинских букв или цифр
Дана последовательность символов, заканчивающихся ‘!’. Определить каких...

Подсчитать в строке число букв А и В, если букв А больше, чем В, то удалить в строке все символы В
Здравствуйте, помогите пожалуйста решить задачу с помощью процедур "Подсчитать...

Подсчитать в строке число букв А и В, если букв А больше, чем В, то удалить в строке все символы В
Помогите пожалуйста! Нужно подсчитать в строке число букв А и В, если букв А...

Подсчитать в строке число букв a и b, если букв а больше b, то удалить в строке все символы b
Помогите, пожалуйста, сделать задачу: Подсчитать в строке число букв a и b,...

Определить, каких букв в тексте больше: гласных или согласных, и подсчитать их количество
определить, каких букв в тексте больше, гласных, или согласных и подсчитать их...

13
masha777
Заблокирован
11.06.2018, 21:37 2
Ребят, нужно написать программу на ассемблере.Задание Ввести строку С,определить чего в строке больше цифр,букв или знаков пунктуации.Заранее спасибо.
0
boikosad
0 / 0 / 0
Регистрация: 11.06.2018
Сообщений: 4
14.06.2018, 10:56  [ТС] 3
Есть код который подсчитивает количество букв и цифр в строке,хочу добавить чтобы считало еще и знаки пунктуации,но хз как
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
.model small
 
.code
org 100h
start:
 
    mov ah,0Ah
    lea dx,buf
    mov si,dx
    int 21h
 
    mov ah,9
    lea dx,digital
    int 21h
 
    inc si
    xor ax,ax
    xor cx,cx
    mov cl,[si]
push cx
    inc si
    mov dx,si
m1:
    lodsb
push cx
    mov cl,10
    lea di,tab
    repne scasb
    jnz short m2
 
    inc ah
m2:
pop cx
    loop m1
    xor al,al
    xchg ah,al
push ax
    call OutInt
 
    mov ah,9
    lea dx,undigital
    int 21h
pop ax
pop cx
    xchg ax,cx
    sub ax,cx
    call OutInt
 
    mov ah,0
    int 16h
 
    ret
OutInt  proc near
    xor cx,cx
    mov bx,10
oi2:
    xor dx,dx
    div bx
    push dx
    inc cx
    test ax,ax
    jnz short oi2
    mov ah,02h
oi3:
    pop dx
    add dl,'0'
    int 21h
    loop oi3
    ret
OutInt  endp
digital   db 10,13,'Cifrovyh simvolov:    $'
undigital db 10,13,'Ne cifrovyh simvolov: $'
 
tab db  '0123456789'
 
buf db 254
    end start
?
0
R71MT
5309 / 1470 / 313
Регистрация: 29.07.2014
Сообщений: 2,511
Записей в блоге: 5
14.06.2018, 11:26 4
Цитата Сообщение от masha777 Посмотреть сообщение
определить чего в строке больше цифр,букв или знаков пунктуации
..а чем они отличаются знаешь?
можешь скачать справочник ASCII-символов и посмотреть, тогда и помощь не потребуется.
1
Jin X
4970 / 1427 / 165
Регистрация: 14.12.2014
Сообщений: 2,726
Записей в блоге: 8
Завершенные тесты: 2
14.06.2018, 18:15 5
Я тут, кстати, недавно придумал способ проверки символа на букву (причём, неважно: русскую или английскую, заглавную или строчную), правда, под Windows.
Но всё равно напишу, может, кому пригодится.

Вызываем CharLower и CharUpper. Если результат разный, значит буква:
Assembler
1
2
3
4
5
6
7
8
; al = буква
movzx ebx,al
invoke CharUpper, ebx
xchg eax,ebx
invoke CharLower, eax
cmp eax,ebx
je NotLetter  ; не буква
; al = буква в нижнем регистре
(предполагается, что ebx уже сохранён).
3
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,533
15.06.2018, 12:55 6
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
232
233
LOCALS
 
.model small
 
.stack 100h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgPrompt       db      'Enter a string:', 0Dh, 0Ah, '$'
        msgResult       db      'Result:'
        msgChars        db      0Dh, 0Ah, ' - chars:  ', '$'
        msgDigits       db      0Dh, 0Ah, ' - digits: ', '$'
        msgPuncts       db      0Dh, 0Ah, ' - puncts: ', '$'
 
        msgCharsG       db      0Dh, 0Ah, 'The line has more letters.', '$'
        msgDigitsG      db      0Dh, 0Ah, 'The line has more digits.', '$'
        msgPunctsG      db      0Dh, 0Ah, 'The line has more puncts.', '$'
 
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
 
        Chars           label   byte
        Latin           db      'ABCDEFGHJKLMNOPQRSTUVWXYZ'
                        db      'abcdefghjklmnopqrstuvwxyz'
        Cyrillic        db      'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ'
                        db      'абвгдеёжзийклмнопрстуфхцчшщьыъэюя'
        CharsAmount     dw      $-Chars
 
        Digits          db      '0123456789'
        DigitsAmount    dw      $-Digits
 
        Puncts          db      '!()-[]{};:', "'", '"', ',.?'
        PunctsAmount    dw      $-Puncts
 
        KeyBuffer       label   byte
        MaxLen          db      80
        Len             db      ?
        String          db      81 dup(?)
 
        CountChars      dw      ?
        CountDigits     dw      ?
        CountPuncts     dw      ?
 
        pStr            label   word
                        dw      offset  msgCharsG
                        dw      offset  msgDigitsG
                        dw      offset  msgPunctsG
.code
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;ввод строки
        mov     ah,     09h
        lea     dx,     [msgPrompt]
        int     21h
        mov     ah,     0Ah
        lea     dx,     [KeyBuffer]
        int     21h
        mov     ah,     09h
        lea     dx,     [CrLf]
        int     21h
        ;обработка строки
        xor     cx,     cx
        mov     [CountChars],   cx
        mov     [CountDigits],  cx
        mov     [CountPuncts],  cx
        mov     cl,     [Len]
        lea     si,     [String]
        cld
        @@for:
                lodsb
                call    IsChar
                adc     [CountChars],   0
                call    IsDigit
                adc     [CountDigits],  0
                call    IsPunct
                adc     [CountPuncts],  0
        loop    @@for
 
        ;вывод результата
        ; - статистика
        mov     ah,     09h
        lea     dx,     [msgResult]
        int     21h
        mov     ax,     [CountChars]
        call    ShowUInt16
        mov     ah,     09h
        lea     dx,     [msgDigits]
        int     21h
        mov     ax,     [CountDigits]
        call    ShowUInt16
        mov     ah,     09h
        lea     dx,     [msgPuncts]
        int     21h
        mov     ax,     [CountPuncts]
        call    ShowUInt16
        ; -
        mov     si,     0
        mov     ax,     [CountChars]
        cmp     ax,     [CountDigits]
        jae     @@3
        mov     si,     1
        mov     ax,     [CountDigits]
@@3:
        cmp     ax,     [CountPuncts]
        jae     @@4
        mov     si,     2
        mov     ax,     [CountPuncts]
@@4:
        mov     ah,     09h
        lea     bx,     [pStr]
        add     bx,     si
        add     bx,     si
        mov     dx,     [bx]
        int     21h
 
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        mov     ax,     4C00h
        int     21h
main    endp
 
;Определяет, принадлежит ли символ в al буквам
;на входе
; al - символ
;на выходе
; CF -  0 (не буква), CF - 1 (буква)
IsChar  proc
        push    ax
        push    cx
        push    es
 
        mov     ah,     1
        push    ds
        pop     es
        lea     di,     [Chars]
        mov     cx,     [CharsAmount]
        cld
        repne   scasb
        jnz     @@icSkip
        mov     ah,     0
@@icSkip:
        cmp     ah,     1
        pop     es
        pop     cx
        pop     ax
        ret
IsChar  endp
 
 
;Определяет, принадлежит ли символ в al цифрам
;на входе
; al - символ
;на выходе
; CF -  0 (не цифра), CF - 1 (цифра)
IsDigit proc
        push    ax
        push    cx
        push    es
 
        mov     ah,     1
        push    ds
        pop     es
        lea     di,     [Digits]
        mov     cx,     [DigitsAmount]
        cld
        repne   scasb
        jnz     @@idSkip
        mov     ah,     0
@@idSkip:
        cmp     ah,     1
        pop     es
        pop     cx
        pop     ax
        ret
IsDigit endp
 
;Определяет, принадлежит ли символ в al знакам пунктуации
;на входе
; al - символ
;на выходе
; CF -  0 (не знак пунктуации), CF - 1 (знак пунктуации)
IsPunct proc
        push    ax
        push    cx
        push    es
 
        mov     ah,     1
        push    ds
        pop     es
        lea     di,     [Puncts]
        mov     cx,     [PunctsAmount]
        cld
        repne   scasb
        jnz     @@ipSkip
        mov     ah,     0
@@ipSkip:
        cmp     ah,     1
        pop     es
        pop     cx
        pop     ax
        ret
IsPunct endp
 
ShowUInt16       proc
        push    bx
        mov     bx,     10
        xor     cx,     cx      ;символов в модуле числа
        @@div:
                xor     dx,     dx
                div     bx
                push    dx
                inc     cx      ;количество цифр в числе
                or      ax,     ax
        jnz     @@div
        mov     ah,     02h
        @@store:
                pop     dx
                add     dl,     '0'
                int     21h
        loop    @@store
        pop     bx
        ret
ShowUInt16       endp
 
end     main
0
Ethereal
5200 / 1943 / 251
Регистрация: 17.02.2013
Сообщений: 2,882
16.06.2018, 20:21 7
Вот примерно так индусы и пишут. Глаза бы мои не видели. Особенно IsDigit через scasb.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
;Определяет, принадлежит ли символ в al цифрам
;на входе
; al - символ
;на выходе
; CF - 0 (не цифра), CF - 1 (цифра)
IsDigit proc
        cmp al, '0'
        cmc
        jnc @@0
        cmp al, '9'+1
@@0:    ret
IsDigit endp
С попутным преобразованием цифры '0'..'9' в ее значение 0..9 будет еще короче :
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
;Определяет, принадлежит ли символ в al цифрам
;на входе
; al - символ
;на выходе
; CF - 0 (не цифра), CF - 1 (цифра)
; al - значение цифры 0..9, если была цифра
IsDigit proc
        add al, -'0'
        jnc @@0
        cmp al, 10
@@0:    ret
IsDigit endp
4
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,533
16.06.2018, 20:49 8
Ethereal, спасибо за критику.
Но в своё оправдание скажу - варюсь в собственном соку и от других форумчан гениальных примеров не вижу - только дружеские "обнимашки" и плюсики за эти "обнимашки".

И добавлю царапающий глаз пример
Assembler
8
        add al, -'0'
Что это было?
0
Jin X
4970 / 1427 / 165
Регистрация: 14.12.2014
Сообщений: 2,726
Записей в блоге: 8
Завершенные тесты: 2
16.06.2018, 20:54 9
Это чтобы флаг CF не выставился при al<'0', потому как sub al,'0' выдаст противоположное значение CF.
1
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,533
16.06.2018, 21:05 10
А так негламурно?
Assembler
8
9
10
11
        sub al, '0'
        jc  @@0  ; оно же jb @@0
        cmp al, 10
@@0:    ret
Добавлено через 6 минут
Понял - это же функция с двумя результатами CF и число.
Спасибо, запомню.
0
Jin X
4970 / 1427 / 165
Регистрация: 14.12.2014
Сообщений: 2,726
Записей в блоге: 8
Завершенные тесты: 2
16.06.2018, 21:15 11
Так будет CF=1 при любом значении al<='9'.
Тогда уж так:
Assembler
1
2
3
4
5
        sub al, '0'
        cmc
        jnc  @@0  ; оно же jnb @@0
        cmp al, 10
@@0:    ret
Добавлено через 1 минуту
Но смысл? Когда sub+cmc можно заменить на один add...

Добавлено через 2 минуты
Только call IsDigit должен быть последним, т.к. он «портит» al.
0
ФедосеевПавел
Модератор
4153 / 2263 / 919
Регистрация: 01.02.2015
Сообщений: 7,533
16.06.2018, 21:19 12
Но это не обязательно к данной программе - можно же использовать в другом месте для фильтрации ввода. И как пример применения не обязательно применительно к цифрам.
0
Ethereal
5200 / 1943 / 251
Регистрация: 17.02.2013
Сообщений: 2,882
17.06.2018, 13:53 13
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
И добавлю царапающий глаз пример
add al, -'0'
Что это было?
Отрицательных чисел никогда не видел что-ли ?
-'0' это код символа 0 со знаком минус. Вот что это.

Добавлено через 5 минут
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Спасибо, запомню.
Надо не запоминать. А дойти до состояния придумывания такого на ходу. Ведь практикуешься же постоянно. Пора бы. Ассемблер, он для того и ассемблер, чтобы использовать то, что он позволяет на всю катушку. А иначе будет не лучше, чем gcc -O3

Добавлено через 15 минут
Мысль такая. Надо воспринимать cmp не как часть готового заклинания CMP Jcond , а уяснить, что она делает. Представлять себе, что cmp вычитает (только результат теряет) и когда вычитает из меньшего большее, то выставляет флаг C. Потому-что был заем. Можно образно представлять себе заем. Можно представлять себе как при сложении add перенос пинком вылетает за пределы байта/слова. И когда появится такое образное представление, написание такого даже трюкачеством казаться перестанет. Нормальным, естественным писанием на ассемблере казаться будет.
1
Jin X
4970 / 1427 / 165
Регистрация: 14.12.2014
Сообщений: 2,726
Записей в блоге: 8
Завершенные тесты: 2
17.06.2018, 18:55 14
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Ещё один вариант:
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
.MODEL Tiny
LOCALS
 
$No             =       -1
$Dig            =       0
$Let            =       1
$Pun            =       2
 
.DATA
 
MsgEnter        DB      'Enter a string:',13,10,'$'
MsgDigits       DB      13,10,10,'Digits: $'
MsgLetters      DB      13,10,'Letters: $'
MsgPuncts       DB      13,10,'Punctuations: $'
MsgMax          DB      ' (maximum value)$'
MsgPressAKey    DB      13,10,10,'Press a key to quit...',13,10,'$'
 
CheckType       DB      $No,'!',$Pun,'0',$Dig,'9'+1,$Pun,'A',$Let,'Z'+1,$Pun,'a',$Let,'z'+1,$Pun,127,$No,'А',$Let,'п'+1,$No,'р',$Let,'ё'+1
lCheckType      =       ($-CheckType)/2
 
Counters        LABEL   WORD
CntDigits       DW      0
CntLetters      DW      0
CntPuncts       DW      0
CntMax          DW      0
 
Buffer          DB      79,?
String          DB      79 DUP (?)
 
.CODE
 
.STARTUP
 
                cld
 
                ; Ввод строки
                mov     ah,9
                lea     dx,MsgEnter
                int     21h
 
                mov     ah,0Ah
                lea     dx,Buffer
                int     21h
 
                ; Анализ строки
                lea     si,String
                jmp     @@start
        @@nextchar:
                lea     di,CheckType
                mov     cx,lCheckType
        @@checknext:
                mov     bx,[di]
                sub     al,bh
                jc      @@found
                add     al,bh
                add     di,2
                loop    @@checknext
                jmp     @@start
        @@found:
                shl     bl,1
                js      @@start
                xor     bh,bh
                inc     Counters[bx]
        @@start:
                lodsb
                cmp     al,' '
                jnb     @@nextchar
 
                ; Максимум
                lea     si,Counters
                mov     cx,3
        @@nextmax:
                lodsw
                cmp     ax,CntMax
                jna     @@notmax
                mov     CntMax,ax
        @@notmax:
                loop    @@nextmax
 
                ; Результаты
                mov     cx,CntDigits
                lea     dx,MsgDigits
                call    ShowResults
                mov     cx,CntLetters
                lea     dx,MsgLetters
                call    ShowResults
                mov     cx,CntPuncts
                lea     dx,MsgPuncts
                call    ShowResults
 
                ; Завершение
                mov     ah,9
                lea     dx,MsgPressAKey
                int     21h
 
                xor     ah,ah
                int     16h
 
                int     20h
 
; Вывод строки по адресу DX, числа CX и информации о максимальном значении
ShowResults     PROC
                mov     ah,9
                int     21h
                mov     ax,cx
                push    ax
                call    OutInt
                pop     ax
                cmp     ax,CntMax
                jb      @@notmax
                mov     ah,9
                lea     dx,MsgMax
                int     21h
        @@notmax:
                ret
ShowResults     ENDP
 
; Вывод целого БЕЗзнакового десятичного числа AX на экран
OutInt          proc
                xor     cx,cx           ; кол-во цифр (пока 0)
                mov     bx,10           ; система счисления (десятичная)
        nextdigit:
                xor     dx,dx           ; DX = 0 (нужно для деления)
                div     bx              ; AX = DX:AX/систему_счисления, DX = остаток
                push    dx              ; сохраняем цифру в стеке
                inc     cx              ; увеличиваем кол-во цифр
                test    ax,ax           ; проверяем AX (число)
                jnz     nextdigit       ; переход, если частное ещё не равно 0
                mov     ah,2            ; номер функции DOS вывода символа на экран
        outdigit:
                pop     dx              ; извлекаем цифру из стека
                add     dl,'0'          ; преобразуем её в символ
                int     21h             ; вывод цифры
                loop    outdigit        ; повторяем цикл вывода символов
                ret                     ; выходим из процедуры
OutInt          endp
 
END
2
17.06.2018, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2018, 18:55

Ввести строку, ввести число N . Вывести результат : символ из позиции N в строке, сделать с использованием команды xlat
Помогите пожалуйста. Прочитал уже кучу статей по xlat и просмотрел много...

Дана последовательность символов, заканчивающихся ".", определить каких латинских букв больше: заглавных или строчных
1. Дана последовательность символов, заканчивающихся ‘.’. Определить каких...

Определить, сколько знаков отношения (<,>,=) присутствует в заданной символьной строке
Бедному начинающему неумехе необходимо решить задачи 1.Определить, сколько...


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

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

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