2013-08-21 5 views
1

글자는 대소 문자 (대문자 또는 소문자)에 관계없이 문자 만 허용하고 대/소문자를 변환하여 표시하는 프로그램이 있다고 가정합니다 (예 : A에서 a ~ A). 그런 다음 프로그램은 오름차순과 내림차순으로 다음 문자를 표시하지만 알파벳 문자 내에서만 표시됩니다. 예를 들어알파벳 내의 표시 문자를 어떻게 제한 할 수 있습니까?

, 만약 입력 'L'및 승순 선택 출력됩니다 그 대문자뿐만 아니라

Input: l 
Display 
[a]ascending 
[d]descending 
Choice:a 
L 
M 
N 
O 
P 
Q 
R 
S 
T 
U 
V 
W 
X 
Y 
Z 

마찬가지로 만 Z.까지 그 이후의 다음 문자를 대응하는 경우, I 입력 E 및 내림차순을 선택하면 해당 소문자와 동등한 다음 문자를 출력합니다. 여기

Input:E 
Display 
[a]ascending 
[d]descending 
Choice:d 
e 
d 
c 
b 
a 

가 지금까지 달성 한 코드의 조각이다, 나는 그것의 대문자와 소문자 등가물에 입력 문자를 변환하는 관리 또한 수직으로 표시 할 수 있었다있다. 내 유일한 문제는 어떻게 알파벳으로 출력을 제한하는 것입니다.

startOver: 
    call cls 
    mov ah,9 
    lea dx,string8  ;Display the string "Input:" 
    int 21h 

    mov ah,1  ;input starting letter 
    int 21h 
    mov bl,al 

    call nlcr    ;nlcr is a procedure for new line and carriage return 

    mov ah,9 
    lea dx,string9  ;Display the string "Display" 
    int 21h 

    call nlcr 

    mov ah,9 
    lea dx,string10  ;Display the string "[a]ascending" 
    int 21h 

    call nlcr 

    mov ah,9 
    lea dx,string11  ;Display the string "[d]descending" 
    int 21h 

    call nlcr  ;nlcr is a procedure for newline and carriage return 

    mov ah,9  ;Display the string "Choice:" 
    lea dx,string12  
    int 21h 

    mov ah,1  ;input display choice if it's ascending or descending 
    int 21h   
    mov cl,al 
    call nlcr 

    cmp cl,'a'  ;validate the display choice 
    je ascending 
    cmp cl,'d' 
    je descending 

    checkd: 
    cmp cl,'d' 
    je descending 
    cmp cl,'d' 

    mov ah,9 
    lea dx,string14 
    int 21h 
    jne startOver 

    ascending:  ;display in ascending order 
    xor bl,20h  ;converts letter to uppercase or lowercase 
    mov ah,2 
    mov dl,bl 
    int 21h 

    mov cx,15   ;display the letters vertically, I put a default of 15 for I am not sure how to limit it to the alphabet only   
    asc: 
    mov bl,dl 
    call nlcr 
    mov dl,bl 
    inc dl 
    int 21h 
    loop asc 
    jmp exit 

    descending:  ;display in descending order 
    xor bl,20h  ;converts letter to uppercase or lowercase 
    mov ah,2 
    mov dl,bl 
    int 21h 

    mov cx,15 
    desc: 
    mov bl,dl 
    call nlcr 
    mov dl,bl 
    dec dl 
    int 21h 
    loop desc 
    jmp exit 

    exit: 
    ;call cls 
    mov ah,4ch 
    int 21h 
    main endp 

답장 보내 주셔서 감사합니다.

답변

0

나는 이런 식으로 변경 것 : 이와 비슷하게

asc: 
    mov bl,dl 
    call nlcr 
    mov dl,bl 
    inc dl 
    int 21h 
    and bl,0DFh ; make sure bl is upper case 
    cmp bl,'Z' 
    jb asc  ; loop until the next character would be 'z'+1 or 'Z'+1 
    jmp exit 

과 내림차순을 위해; execpt를 입력하면 'A'과 비교하고 jb 대신 ja을 사용합니다.

+0

와우! 그 라인의 몇 가지 매력처럼 작동하게했다! 감사! –

1

내 유일한 문제는 알파벳 만 출력하는 방법입니다.

다른 언어와 마찬가지로 : 문자 하나당 범위 검사 (하나 이상) 또는 조회 표 (아마도 범위 검사 또는 몇 개를 사용하여 작성)를 수행합니다. ASCII는 1 바이트를 처리해야하기 때문에 테이블에 256 개의 항목이 있습니다. 항목 당 바이트를 사용하면 256 바이트가되므로 대용량 테이블이 아니기 때문에 생성하기 쉽고 사용하기 쉽습니다.

아스키를 사용하는 경우 (대문자와 소문자가 구분된다는 것을 알고 있음) 알파벳 테스트에 실패 할 때까지 반복 한 다음 26 또는 27을 백업 한 다음 시작 문자를 누를 때까지 계속 진행합니다.

msbit가 0이면 위와 아래가 1 비트 씩 차이가 난다고 생각합니다. 그 비트를 강제로하고 단일 범위 검사를 수행하여 알파벳 내에 있는지 확인하십시오. 룩업 테이블만큼 빠르지 만 두 개 이상의 범위 검사보다 빠릅니다.