b) IF_THEN_ELSE
3.5 Laơp trình với câu trúc câp cao
Bài toán:Viêtchươngtrình nhaĩcngườidùnggõvàomoơtdòngvaínbạn. Tređn2dòngtiêptheoinrakýtựviêthoađaăutieđnvàkýtự viêthoacuôi cùngtheo thứtự alphabetical.Nêungườidùnggõvàomoơtkýtựthường,máysẽthođngbáo ‘Nocapitals’
Kêtqụacháychươngtrình sẽnhưsau:
TRUONGDAi HOCDALAT
Firstcapital=A Lastcapital=U
ĐeơgiạibàitoánnàytadùngkỹthuaơtlaơptrìnhTOP-DOWN,nghĩalàchia nhỏbàitoán thànhnhieăubàitoáncon.Cótheơchiabàitoánthành3bàitoáncon nhưsau:
1.Xuât1chuoêikýtự(lờinhaĩc) 2.Đĩcvàxửlý1dòngvaínbạn 3.Inkêtqụa
Bước 1: Hieơndâunhaĩc.
Bướcnàycótheơmãhoánhưsau: MOV AH,9 ;hàmxuâtchuoêi
LEA DX,PRMOPT;lâyđịachưchuoêivàoDX INT 21H ;xuâtchuoêi
Dâunhaĩccótheơmãhoánhưsautrongđốnsôlieơu.
Chương 3: Các leơnh laịp và rẽ nhánh 40 PROMPT DB ‘Typealineoftext:’,0DH,0AH,’$’
Bước2:Đĩcvàxửlýmoơtdòngvaínbạn
Bướcnàythựchieơnhaăuhêtcáccođngvieơccụachươngtrình:đĩccáckýtựtừ bànphím,tìmrakýtựđaăuvàkýtựcuôi,nhaĩcnhởngườidùngnêukýtựgõvào khođngphạilàkýtựhoa.
Cótheơbieêudieênbướcnàybởithuaơttoánsau: Readacharacter
WHILE characterisnotacarrigereturn DO IFcharacterisacapital(*)
THEN
IFcharacterprecedesfirstcapital Then
firstcapital=character End_if
IFcharacterfollowslastcharacter Then
lastcharacter=character End_if
END_IF
Readacharacter END_WHILE
Trongđódòng(*)cónghĩalàđieăukieơnđeơkýtựlàhoalàđieăukieơnAND IF(‘A’<=character)AND(character<=‘Z’)
Bước2cótheơmãhoá nhưsau:
MOV AH,1 ;đĩckýtự INT 21H ;kýtựtređnAL WHILE:
;trongkhikýtựgõvàokhođngphạilàCRthìthựchieơn CMP AL,0DH ;CR?
JE END_WHILE ;yes,thoát ;nêukýtựlàhoa
CMP AL,’A’ ;char>=‘A’?
JNGE END_IF ;khođngphạikýtựhoathìnhạyđênEND_IF CMP AL,’Z’ ;char<=‘Z’?
JNLE END_IF ;khođngphạikýtựhoathìnhạyđênEND_IF ;thì
Chương 3: Các leơnh laịp và rẽ nhánh 41 ;nêuký tựnaỉm trướcbiênFIRST(giátrịbanđaăulà‘[‘:kýtựsauZ)
CMP AL,FISRT ;char<FIRST? JNL CHECK_LAST;>=
;thì kýtự viêthoađaăutieđn=ký tự
MOV FIRST,AL ;FIRST=character ;end_if
CHECK_LAST:
;nêuký tựlàsaubiênLAST(giátrịbanđaăulà‘@’:kýtựtrướcA) CMP AL,LAST ;char>LAST?
JNG END_IF ;<= ;thìkýtựcuôicùng=kýtự
MOV LAST,AL ;LAST=character ;end_if END_IF: ;đĩcmoơtkýtự INT 21H ;kýtựtređnAL JMP WHILE_ ;laịp END_WHILE:
CácbiênFIRSTvàLASTđượcđịnhnghĩa nhưsautrongđốnsôlieơu: FIRST DB ‘[$‘ ;‘[‘làkýtựsauZ
LAST DB ‘@$’ ;‘@’ làkýtựtrước A
Bước 3 : Inkêtqụa
Thuaơttoán
IF nocapitalweretyped THEN
display ‘No capital’ ELSE
displayfirstcapitalandlastcapital END_IF
Bước3sẽphạiinracác thođngbáo:
• NOCAP_MSGnêukhođngphạichữin
• CAP1_MSG chữin đaăutieđn
• CAP2_MSG chữincuôicùng
Chúngđượcđịnhnghĩanhưsautrongđốnsôlieơu.
NOCAP_MSG DB 0DH,0AH,‘Nocapitals$’ CAP1_MSG DB 0DH,0AH,‘Firstcapital=’ FIRST DB ‘[$’
CAP2_MSG DB 0DH,0AH,‘Lastcapital=’
Chương 3: Các leơnh laịp và rẽ nhánh 42 LAST DB ‘@$’
Bước3cótheơmãhoánhưsau: ;inkêtquạ
MOV AH,9 ;hàmxuâtkýtự
;IFkhođngcóchữhoanàođượcnhaơpthìFIRST=‘[’ CMP FIRST,’[’ ;FIRST=‘[’?
JNE CAPS ;khođng,inkêtqụa ;THEN LEA DX,NOCAP_MSG INT 21H CAPS: LEA DX,CAP1_MSG INT 21H LEA DX,CAP2_MSG INT 21H ;end_if
Chươngtrìnhcótheơviêtnhưsau:
TITLE PGM3-1:FIRSTANDLASTCAPITALS .MODEL SMALL
.STACK 100h .DATA
PROMPT DB ‘Typealineoftext’,0DH,AH,‘$’ NOCAP_MSG DB 0DH,0AH,‘Nocapitals$’ CAP1_MSG DB 0DH,0AH, ‘Firstcapital=’ FIRST DB ‘[$’
CAP2_MSG DB ‘Lastcapital=’ LAST DB ‘@$’
MAIN PROC ;khởitáoDS
MOV AX,@DATA MOV DS,AX ;indâunhaĩc
MOV AH,9 ;hàmxuâtchuoêi
LEA DX,PROMPT;lâyđịachưchuoêivàoDX INT 21H ;xuâtchuoêi
Chương 3: Các leơnh laịp và rẽ nhánh 43
;đĩcvàxửlý1dòngvaínbạn
MOV AH,1 ;đĩckýtự INT 21H ;kýtựtređnAL WHILE:
;trongkhikýtựgõvàokhođngphạilàCRthìthựchieơn CMP AL,0DH ;CR?
JE END_WHILE ;yes,thoát ;nêukýtựlàhoa
CMP AL,’A’ ;char>=‘A’?
JNGE END_IF ;khođngphạikýtựhoathìnhạyđênEND_IF CMP AL,’Z’ ;char<=‘Z’?
JNLE END_IF ;khođngphạikýtựhoathìnhạyđênEND_IF ;thì
;nêukýtựnaỉmtrướcbiênFIRST
CMP AL,FISRT ;char<FIRST? JNL CHECK_LAST;>=
;thì kýtự viêthoađaăutieđn=ký tự
MOV FIRST,AL ;FIRST=character ;end_if
CHECK_LAST:
;nêukýtựlàsaubiênLAST
CMP AL,LAST ;char>LAST? JNG END_IF ;<=
;thìkýtựcuôicùng=kýtự
MOV LAST,AL ;LAST=character ;end_if END_IF: ;đĩcmoơtkýtự INT 21H ;kýtựtređnAL JMP WHILE_ ;laịp END_WHILE:
;inkêtquạ
MOV AH,9 ;hàmxuâtkýtự
;IFkhođngcóchữhoanàođượcnhaơpthìFIRST=‘[‘ CMP FIRST,’[‘ ;FIRST=‘[‘?
JNE CAPS ;khođng,inkêtqụa ;Then LEA DX,NOCAP_MSG INT 21H CAPS: LEA DX,CAP1_MSG
Chương 3: Các leơnh laịp và rẽ nhánh 44 INT 21H LEA DX,CAP2_MSG INT 21H ;end_if ;dosexit MOV AH,4CH INT 21h MAINENDP END MAIN
Chương4:Các leơnh dịch và quay 45
Chương 4 : CÁC LEƠNHLOGIC,DỊCH VAØQUAY
Trongchươngnàychúngtasẽxemxétcác leơnhmàchúngcótheơdùngđeơ thayđoơitừngbit tređnmoơtbytehoaịcmoơttừ sôlieơu.Khạnaíngquạnlýđêntừngbit thườnglàkhođngcótrongcácngođnngữcâpcao(trừC)vàđađylàlýdogiạithíchtái saohợpngữvăn đóngvaitròquantrĩngtrongkhilaơptrình.