Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2013, 17:48   #1
Eclipse_Me
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 11
Вопрос Сумма редких символов в строке

Такое задание:
Ввести английское предложение. Каких букв в веденной строке меньше всего и сколько их. Ответ вывести синим цветом в центре экрана.

Смог написать программу, которая считает самый повторяющийся символ, но не знаю как изменить, чтобы выводила все по заданию, доскажите, пожалуйста...
Код:
masm
model small

.data
MyStr	db	'ssa' 	; Исходная строка.
FrecSim db	?										; Наиболее часто встречающийся символ.   
.code
programm:

;-----------------------------------------------------------------------------------------	
Find proc
	mov	ah, 0	         							; Счётчик внешнего цикла по всем элементам  таблицы ASCII-кодов.
	mov	ch, 0										; Частота вхождения самого частовстреч. символа.
M1:	mov	si, 0             							; Счётчик внутреннего цикла по всем символам строки MyStr.
	mov	cl, 0										; Сколько раз встречался текущий символ.
M2:	mov	al, MyStr[si] 								; Запись строки в регистр AL
	cmp	al, ah           							; Сравнение AL и AH
	jne	M3           								; Прыжок на М3, если  не равно
	inc	cl	        								; Да, встретился текущий символ.
M3:	inc	si                 							; Увеличение на единицу
	cmp	MyStr[si], 0 								; Завершение тела внутреннего цикла.
	jne	M2              							; Прыжок на М2, если  не равно
	cmp	cl, ch          							; Сравнивание CL и CH (частота вхождения сам встречающегося и текущего)
	jna	M4               							; Прыжок на М4, если  не выше     (!!!!)
	mov	ch, cl     									; Нашли новый, более частовстречающйся
	mov	FrecSim, ah									; символ.
M4:	inc	ah											; Завершение внешнего цикла - пока не
	jnz	M1              							; переберём все ASCII-символы от 0 до 255.      (если не нуль)
	ret
endp
;-----------------------------------------------------------------------------------------	

	mov AX, @data
	mov DS, AX
	
	call Find
	
	mov dx, offset MyStr 
	mov ah, 09h
	int 21h	
	
	mov ah, 01h 
	int 21h   
   
end programm
Eclipse_Me вне форума Ответить с цитированием
Старый 18.10.2013, 20:00   #2
skaa
Новичок
Джуниор
 
Регистрация: 10.01.2011
Сообщений: 1
По умолчанию

Можно отсортировать строку, а потом идти по ней и считать. Максимум запомнить... Только что делать если строка с двумя или более "максимальными" символами, например такая:
Do cats eat bats?
Здесь пробелов, букв a и t одинаково 3.
skaa вне форума Ответить с цитированием
Старый 18.10.2013, 22:52   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

skaa, в задании нужно найти самый РЕДКИЙ символ (тот, что встречается меньше всего...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.10.2013, 03:59   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Eclipse_Me,
чаще нажимай на кнопку поиск
Гистограмма количества латинских букв
Mikl___ вне форума Ответить с цитированием
Старый 19.10.2013, 09:38   #5
Eclipse_Me
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 11
По умолчанию

Спасибо большое, я уже свое написал. Единственное не могли бы вы еще сказать, как организовать ввод строки с клавиатуры и запись ее в переменную?
Eclipse_Me вне форума Ответить с цитированием
Старый 19.10.2013, 20:09   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Eclipse_Me, а зачем нарушать правила и создавать ДВЕ темы про одно и то же?! ;(
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.10.2013, 09:54   #7
Eclipse_Me
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Eclipse_Me, а зачем нарушать правила и создавать ДВЕ темы про одно и то же?! ;(
Потому что не там и не там не могут обьяснить
Eclipse_Me вне форума Ответить с цитированием
Старый 20.10.2013, 10:02   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Eclipse_Me Посмотреть сообщение
Потому что не там и не там не могут обьяснить
так Вам надо ещё две-три одинаковые темы создать. Можно даже в разных разделах! Тогда уж Вам точно объяснят!


Это сарказм, это, если что. не надо нарушать правила и создавать темы-дупликаты!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.10.2013, 11:40   #9
Eclipse_Me
Пользователь
 
Регистрация: 16.10.2013
Сообщений: 11
По умолчанию

Спасибо всем кто помог)
Вот окончательный код, если кому-то понадобится когда-либо.
Сумма редких символов в строке и вывод на экран синим цветом в центре.
Код:
masm
model small
.data
sInput	db	'Enter string>  $'
bye	db	'Press enter to exit>  $'
buf	label	byte		; буфер для приема строки с клавиатуры (по ф-и 0ah)
max	db	128		; максимальная длина строки
len	db	0		; реальная длина введенной строки
Mystr	db	128 dup (0)	; сама строка
minb db	?					; Наиболее часто встречающийся символ.   
sum db	?
chislo db	?
.code
;------------Процедуры_начало------------
mac macro x, y, z
	mov ah, 02h
	mov dh, y
	mov dl, x 
	int 10h
	mov ah, 09h
	mov bl, z ;1 для синего сильно
	int 10h
endm 
mac2 macro ex
	mov ah, 09h
	mov al, ex
	mov bh,0
	mov bl, 1 
	int 10h
endm
; чистим экран через BIOS
clrs	proc	near
		mov		ax,0600h
		mov		bh,07h
		mov		cx,0000
		mov		dx,184fh
		int		10h
		mov ax,0
		mov bx,0
		mov dx,0
		mov cx,0
		ret
clrs	endp
compare proc 
	cmp al, 10
	jl  @@metka
	add al, 37h 
	mac2 al
	mov dl, al
	mov ah, 02h
	int 21h	
	ret
@@metka:
	add al, 30h
	mac2 al
	mov dl, al
	mov ah, 02h
	int 21h     
    ret
endp
vivod_chislo proc
	mov AL, sum  
	and al, 0f0h
	ror al, 4 
	call compare 
	mov al, sum
	and al, 0fh
	call compare 
	ret
endp
calc proc
	mov SI, 0							;j
	mov DI, 0							;i
	mov AL, 0							;sum
	mov CL, 0FFh						;min
@while_OUT: 
	cmp Mystr[DI], '.' 
	je @EndWhile_OUT
	mov SI, 0
	mov AL, 0
@while_IN:
	mov BL, Mystr[SI]
	cmp BL, '.' 
	je @EndWhile_IN
	mov BL, Mystr[DI]
	cmp Mystr[SI],BL; 
	jne @IfNot_1; 
	inc AL
@IfNot_1:
	inc SI
	jmp @while_IN
@EndWhile_IN:
	cmp CL, AL 
	jna @IfNot_2 
	mov CL, AL
	mov BL, Mystr[DI]
	mov minb, BL
	mov sum, AL
@IfNot_2:
	inc DI
	jmp @while_OUT
@EndWhile_OUT:
	ret
endp

vivod_bukva proc
	mac 39,12,1
	mov DX,0
	mov dl, minb 
	mov ah, 02h
	int 21h	
	call vivod_chislo
	mac 42,12,0
	ret
endp
 

;------------Процедуры_конец------------
programm:
	mov AX, @data
	mov DS, AX
	
	lea	dx, sInput
	mov	ah, 9
	int	21h		; приглашение на экран

	lea	dx, buf
	mov	ah, 0ah
	int	21h		; вводим строку
	
	call clrs
	call calc
	call vivod_bukva
	
	mac 0,24,0fh
	mov dx, offset bye
	mov	ah, 9h
	int	21h		
	mov	ah, 0ah
	int	21h
	mov ax, 4c00h
	int 21h  

		
end programm
а вот суть алгоритма на pascal, тоже если необходимо:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j,sum,min:integer;
str: string;
minb: char;
begin
str:='входящая строка0';
i:=1;
j:=1;
min:=255;
while (str[i]<>'0') do
  begin
		j:=1;
    sum:=0;
		while(str[j]<>'0') do
    begin
			  if (str[i]=str[j]) then	sum:=sum+1;
			  j:=j+1;
    end;

    if(sum<min)then
    begin
				min:=sum;
				minb:=str[i];
    end;
	i:=i+1;
  end;
  button1.Caption:=minb;
end;
Eclipse_Me вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма ЧИСЕЛ в строке MainUnit.pas Microsoft Office Word 10 15.01.2013 19:22
Сумма чисел в строке microlab Паскаль, Turbo Pascal, PascalABC.NET 5 14.02.2012 12:49
Сумма значений в строке. Vitaliy_R Microsoft Office Excel 10 21.04.2010 11:30
Удаление редких символов в VBA Ohmu Microsoft Office Excel 6 30.12.2009 15:58
Сумма чисел в строке Oleg36 Помощь студентам 1 26.12.2008 08:39