5 / 5 / 1
Регистрация: 13.12.2015
Сообщений: 51
1
TASM

Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов больше

02.04.2016, 19:59. Показов 2657. Ответов 3
Метки нет (Все метки)

Подсчитать количество символов ‘c’ и ‘d’ во введенной строке и определить, каких из символов ‘c’ или ‘d’ больше. Строку описать в сегменте данных или ввести с клавиатуры.

Листинг на асе:
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
model small
.stack 100h
.data
mes1 db "Vvedite stroky: $"
mes3 db 0ah,0dh,"Kol-vo povtoreniy vvedennogo simvola: $"
mes4 db 0ah,0dh,"Vvedite proizvonuy simvol dlya sravneniya: $"
mes5 db 0ah,0dh,"Simvol nekorrekten: $"
string db 10 dup ("$")
    len_string = $ - string
    adr_string dd string
.code
main:
    mov ax,@data
    mov ds,ax
    xor ax,ax
    mov ah,09h ;заносим в ah 09h
    lea dx,mes1 ;в dx смещение строки mes1
    int 21h ;вызов прерывания DOS для вывода строки
    mov cx,len_string ;в cx заносим длину строки
    dec cx ;уменьшить на* 1 счётчик cx
    les di,adr_string ;в di смещение, в es сегментный адресс
m1:
    mov ah,01h ;в ah заносим 01h
    int 21h ;в AL - символ, полученный из станлартного ввода*
    cmp al,0dh ;проверяем нажатие Enter
    je prov ;если равно прыгаем на метку prov
    cmp al,0 ;сравниваем al с нулём
    jne m2 ;если не равно прыгаем на метку m2
    jmp prov ;прыгаем на метку prov
m2:
    stosb ;переписываем содержимое AL в ячейку памяти с адрессом ES: (E)DI, после чего прибовляем единицу к (E)DI.
    
    loop m1 ;выполняем m1, пока* cx не станет равным нулю
prov:
    mov cx,len_string ;в cx заносим длину строки
    dec cx ;уменьшаем cx на единицу
    mov si,0 ;переводим сегментный регистор si **в начало строки
exit:
    
    lea dx,mes4
    mov ah,09h
    int 21h
    mov ah,01h
    int 21h
    cmp al,0
    je not2
go:
    cmp string[si],al
    jne go1
    inc bh
go1:
    inc si
    loop go
lea dx,mes3
mov ah,09h
int 21h
add bh,"0"
mov dl,bh
mov ah,02h
int 21h
jmp ex
not2:
    lea dx,mes5
    mov ah,09h
    int 21h
ex:
    mov ax,4c00h
    mov ah,10h
    
mov ah,0
int 16h
все хорошо на поиск тут только одного символа, как сделать на два и сравнить их ( больше 1 сим или 2 символа?)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.04.2016, 19:59
Ответы с готовыми решениями:

Подсчитать количество символов во введённой строке
а)Составить программу, которая будет подсчитывать количество символов во введённой строке....

Во введенной строке символов подсчитать количество разделителей
Во введенной строке символов подсчитать количество разделителей (любые скобки, точка, запятая,...

Во введенной строке подсчитать количество гласных символов
Делаю семестровку. Задание такое: разработать программу на языке Ассемблера Интелx86 для ДОС....

Посчитать сколько символов А и B во введенной строке. Если символов А больше, то все символы B заменить на А, и наоборот
Посчитать сколько символов А и B во введенной строке. Если символов А больше, то все символы B...

3
Прощай, Мир!
1672 / 829 / 253
Регистрация: 26.05.2012
Сообщений: 3,057
03.04.2016, 14:12 2
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

здесь вот. только без вывода количества повторений символов
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
.model small                
.386                        
 
.data
mes1    db 'Vvedite stroku: $'
mes2    db 0Dh,0Ah,'Bolshe simvolov "c"$'
mes3    db 0Dh,0Ah,'Bolshe simvolov "d"$'
mes4    db 0Dh,0Ah,'Kolichestvo simvolov "c" i "d" ravno$'
string  db  10 dup ('$')
len_string  dw  $-string-1
 
.stack                  
    db  256 dup(?)      
 
.code                   
start:                  
    mov ax,@data
    mov ds,ax
    
    push ds
    pop es
    
    mov ah,09h
    lea dx,mes1
    int 21h
    
    lea di,string
    mov cx,len_string
    m1:
        mov ah,01h
        int 21h
    
        cmp al,0Dh
        je prov
    
        stosb
    loop m1
    
    prov:
    xor bx,bx
    
    xor si,si
    mov cx,len_string
    go1:
        cmp string[si],'c'
        jne go2
    
        inc bh
    
        go2:
        inc si
    loop go1
    
    xor si,si
    mov cx,len_string
    go3:
        cmp string[si],'d'
        jne go4
    
        inc bl
    
        go4:
        inc si
    loop go3
    
    cmp bh,bl
    jg one
    
    cmp bh,bl
    jz equal
    
    lea dx,mes3
    jmp print
    
    one:
    lea dx,mes2
    jmp print
    
    equal:
    lea dx,mes4
    
    print:
    mov ah,09h
    int 21h
    
    mov ah,4Ch              
    mov al,00h              
    int 21h
end start
1
Terminator of naked apes
832 / 139 / 34
Регистрация: 13.02.2015
Сообщений: 328
04.04.2016, 22:53 3
dimaondmersik, развод хороший, годный (источник копипасты, например ;о)
0
Эксперт Hardware
Эксперт Hardware
5427 / 1967 / 361
Регистрация: 29.07.2014
Сообщений: 2,885
Записей в блоге: 4
05.04.2016, 20:49 4
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

..можно типа такого замутить.
Ошибку на равенство лень обрабатывать. Максимальное вхождение искомого символа - 9:

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
org 100h
jmp start
 
mes1  db  13,10,'Vvedite stroky. . .: $'
mes2  db  13,10,'Simvolov "C". . . .: $'
mes3  db  13,10,'Simvolov "D". . . .: $'
mes4  db  13,10,'-------------------------'
      db  13,10,'Simvolov ',0,' bolshe!$'     ; по-адресу(0) вставим букву
buff  db  60 dup(0)
 
start:
   mov   ah,9                 ; мессага
   mov   dx,mes1              ;
   int   21h                  ;
 
   mov   di,buff              ; DI для STOSB
   loop  $                    ; CX = 0
   xor   ax,ax                ; AX = 0
   inc   ah                   ; AH = 1 (ввод с эхо)
@@:                           ;
   int   21h                  ; вводим символ..
   cmp   al,13                ; Enter заканчивает ввод
   je    next                 ;
   and   al,11011111b         ; переводим символ в верхний регистр
   stosb                      ; запись в буфер
   inc   cx                   ; считаем длину строки..
   jmp   @b                   ;
 
next:                         ; строка в буфере!
   inc   cx                   ; захватим последний символ
   mov   dx,cx                ; DX/CX = длина строки
   sub   bx,bx                ; ВХ = 0 (счётчик найденных)
   mov   di,buff              ; DI для SCASB
   mov   al,'D'               ; символ для поиска
@@:                           ;
   repne scasb                ; ищем символ в строке,
   or    cx,cx                ;    ..пока СХ не станет нуль
   jz    find_c               ;
   inc   bx                   ; счётчик(D) +1
   jmp   @b                   ;
 
find_c:                       ;
   push  bx                   ; сохраняем кол-во "D"
   sub   bx,bx                ; сбрасываем счётчик,
   xchg  cx,dx                ;    ..восстанавливаем длину,
   sub   di,cx                ;         ..и маркер начала строки
   dec   al                   ; символ для поиска "С"
@@:                           ;
   repne scasb                ;
   or    cx,cx                ;
   jz    compare              ;
   inc   bx                   ; счётчик(C) +1
   jmp   @b                   ;
 
compare:                      ;
   push  bx                   ; сохраняем кол-во "C"
   mov   ah,9                 ;
   mov   dx,mes2              ;
   int   21h                  ;
   pop   ax                   ;
   mov   bh,al                ; BH = количество(С)
   add   al,30h               ;
   int   29h                  ; выводим цифру на экран!
 
   mov   ah,9                 ;
   mov   dx,mes3              ;
   int   21h                  ;
   pop   ax                   ;
   mov   bl,al                ; BL = количество(D)
   add   al,30h               ;
   int   29h                  ; выводим цифру на экран!
 
   mov   ah,9                 ;
   mov   dx,mes4              ;
   cmp   bh,bl                ; поиск наибольшего
   jbe   change               ;
   mov   byte[mes4+38],'C'    ;
   jmp   print                ;
change:                       ;
   mov   byte[mes4+38],'D'    ;
print:                        ;
   int   21h                  ; выводим мессагу на экран
 
exit:
   xor   ax,ax                ;
   int   16h                  ;
   int   20h                  ; выход по-любой клавише
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.04.2016, 20:49
Помогаю со студенческими работами здесь

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

Множества. Во введенной строке символов подсчитать количество различных (без повторений) букв
4.Во введенной строке символов, содержащей прописные буквы русского алфавита,подсчитать количество...

Не используя массивы, подсчитать во введенной строке символов общее количество цифр и букв S
Как сделать эти программы без массива? Во введенной строке символов подсчитать общее количество...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru