『壹』 編譯原理具體概念是什麼,怎樣用詞法分析來解決整數的四則運算問題
#include
『貳』 匯編語言實現四則運算
; 本程序通過編譯,運行正確
Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -----------------------------------------
; 功能:顯示指定地址(Str_Addr)的字元串
; 入口:
; Str_Addr=字元串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:取游標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置游標位置
; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:輸出回車換行
enter_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
enter_CTLF endp
; -----------------------------------------
; 功能:輸出一個字元
; 入口:dl=要顯示的字元
enter_Chr proc Near
push ax
mov ah,02h
int 21h
pop ax
ret
enter_Chr endp
; -----------------------------------------
; 功能:鍵盤輸入一個N位的十進制數字,
; 用邏輯和移位指令將其轉換成二進制數並保存在指定的內存單元。
; 入口:N=數字位數;di=保存輸入的數字首地址
; 出口:轉換後的二進制數保存在di所指的單元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cx,N
push cx
@@Input: call GetCursor ;取游標位置
mov ah,1 ;從鍵盤接受一個字元
int 21h
cmp al,CR ;若鍵入的是回車,已經鍵入的數字不足N位
jz @@ASC_Dec ;轉去處理已經鍵入的數字
cmp al,KBBack
jz @@KB_Back ;若是回空鍵,重新輸入
cmp al,'0'
jb @@KBBack ;若低於數字'0',重新輸入
cmp al,'9'
ja @@KBBack ;若低於數字'9',重新輸入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置游標位置
jmp @@Input
@@Save_Dig: and al,0fh ;轉換成二進制數
stosb ;保存
loop @@Input ;接受下一個數字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;實際輸入的數字位數
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回車,沒有輸入任何數字,按輸入'0'處理
dec cx ;實際輸入的數字位數減1,准備把輸入的這一串數字轉換成二進制數
jcxz @@One_Digit ;若輸入的數字只有一位,轉去直接保存這個二進制數
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit:lodsb
cbw
add ax,bp
@@Save_Ret: pop di
stosw
pop bx
pop cx
pop dx
ret
@@Save_Tmp db 16 p(?)
Input_Digit EndP
; -----------------------------------------
; 功能:把AX中的二進制有、無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Dec_ASCII Proc Near
push dx
push bx
push di
.IF Signed == 'y'
mov @@Carry_Yes,'+'
test ax,8000h
jz $+9
mov @@Carry_Yes,'-'
neg ax
.Endif
mov bx,10
lea di,@@Temp_Save[6]
mov byte ptr [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
.IF Signed == 'y'
cmp @@Carry_Yes,'-'
jnz $+6
mov byte ptr [di],'-'
dec di
.Endif
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 7 p(?)
@@Carry_Yes db '+'
Dec_ASCII EndP
; -----------------------------------------
N equ 3 ;輸入的十進制整數位數
Signed db 'n' ;是否有符號數。'y'=有符號數,'n'=無符號數
Number1 dw ?
Number2 dw ?
Period_Aft db 3 ;保留小數位數
prompt_One db 'Please the first number: $'
prompt_Two db 'Please the second number: $'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
; -----------------------------------------
; 輸入兩個十進制數
Output prompt_One ;提示輸入第一個數
lea di,Number1 ;變數Number1的地址
call Input_Digit ;從鍵盤接受一個N位數字
call enter_CTLF ;輸出一個回車、換行
Output prompt_Two ;提示輸入第一個數
lea di,Number2 ;變數Number1的地址
call Input_Digit ;從鍵盤接受一個N位數字
call enter_CTLF ;輸出一個回車、換行
call enter_CTLF ;輸出一個回車、換行
; -----------------------------------------
; 加法運算
mov ax,Number1
call Dec_ASCII ;把AX中的二進制有、無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
mov dl,'+'
call enter_Chr ;顯示一個加號
mov ax,Number2
call Dec_ASCII ;顯示第二個數
mov dl,'='
call enter_Chr ;顯示一個等號
mov ax,Number1
add ax,Number2 ;Number1+Number2→AX
call Dec_ASCII ;顯示和
call enter_CTLF ;輸出一個回車、換行
; -----------------------------------------
; 減法運算
mov ax,Number1
call Dec_ASCII ;把AX中的二進制有、無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
mov dl,'-'
call enter_Chr ;顯示一個減號
mov ax,Number2
call Dec_ASCII ;顯示第二個數
mov dl,'='
call enter_Chr ;顯示一個等號
mov ax,Number1
sub ax,Number2 ;Number1-Number2→AX
call Dec_ASCII ;顯示差
call enter_CTLF ;輸出一個回車、換行
; -----------------------------------------
; 乘法運算(請事先算好了,否則,容易導致乘積超過16位寄存器能夠表示的范圍)
mov ax,Number1
call Dec_ASCII ;把AX中的二進制有、無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
mov dl,'*'
call enter_Chr ;顯示一個乘號
mov ax,Number2
call Dec_ASCII ;顯示第二個數
mov dl,'='
call enter_Chr ;顯示一個等號
mov ax,Number1
.IF Signed == 'y' ;有符號數乘法
imul Number2 ;Number1*Number2→AX
.ELSE ;無符號數乘法
mul Number2 ;Number1*Number2→AX
.Endif
call Dec_ASCII ;顯示乘積(假定乘積不超過16位寄存器能夠表示的范圍)
call enter_CTLF ;輸出一個回車、換行
; -----------------------------------------
; 除法運算
mov ax,Number1
call Dec_ASCII ;把AX中的二進制有、無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
mov dl,'/'
call enter_Chr ;顯示一個除號
mov ax,Number2
call Dec_ASCII ;顯示第二個數
mov dl,'='
call enter_Chr ;顯示一個等號
xor dx,dx
mov ax,Number1
.IF Signed == 'y' ;有符號數乘法
idiv Number2 ;Number1/Number2→AX(商),DX(余數)
.ELSE ;無符號數乘法
div Number2 ;Number1/Number2→AX(商),DX(余數)
.Endif
call Dec_ASCII ;顯示商數的整數部分
test dx,0ffffh ;判斷余數是否為0
jz Exit_Proc ;能夠整除,結束程序
push dx
mov dl,'.'
call enter_Chr ;顯示一個小數點
pop dx
mov bp,10 ;乘數
mov cl,Period_Aft ;保留小數位數
xor ch,ch
Dec_Frac: mov ax,dx ;余數不為0,處理小數部分
mul bp ;余數乘10,繼續做除法
div Number2 ;除以除數,取商數作為結果的一位小數
push dx
or al,30h
mov dl,al
call enter_Chr ;顯示一位小數
pop dx
test dx,0ffffh ;判斷余數是否為0
jz Exit_Proc ;能夠整除,結束程序
loop Dec_Frac
call enter_CTLF ;輸出一個回車、換行
; -----------------------------------------
Exit_Proc: mov ah,4ch ;結束程序
int 21h
Code ENDS
END Start ;編譯到此結束
『叄』 怎麼用C語言編寫一個大整數的四則運算器,求解(急!!)
1.打開CodeBlocks,創建一個新的空白文件,定義頭文件和主要功能,然後寫程序的主體:
『肆』 java怎麼利用動態編譯求四則運算式的結果貼代碼的最後注釋一下,免得我看不懂,求高手大神來回答
首先,要有個文本框,記錄下來這個表達式,你說的,是要做個計算器吧,每個按鈕提供一項功能,有數字鍵,有運算符鍵,實現一下
『伍』 MATLAB中怎麼在編譯器中定義一個四則運算函數
clccleara=round(rand*90)+10;b=round(rand*90)+10;c=input('請輸入一個四則運算符號,請用單引號括起來');switchccase'+'d=a+b;case'-'d=a-b;case'*'d=a*b;case'/'d=a/b;endd示範:請輸入一個四則運算符號,請用單引號括起來'*'d=7520
『陸』 用C語言編譯一個包含加減乘除四則運算的計算器,求思路
#include
#include
using
namespace
std;
int
main()
{
int
a,b;//a是輸出結果,b是臨時輸入數據
char
x;//x是標點符號輸入
cin>>a;//先輸入第一個數
while(1)//由於不知道運算式一共多長,所以用一個死循環不斷讀取
{
cin>>x;//輸入運算符
if(x.
『柒』 c語言的四則運算
剛學c時也總是遇見這種問題,後來才發現原來是scanf函數的問題,你可以在每個scanf後加一個getchar,當然,最好的辦法就是清空輸入流,即按第一位回答者說的那樣用fflush(stdin)
『捌』 匯編編程 2位十進制數的四則運算
; 本程序在MASMPlus 1.2集成環境下通過編譯,經過調試,運行正確。
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:顯示指定地址(Str_Addr)的字元串
; 入口:
; Str_Addr=字元串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -------------------------------------
ASCII_Binary MACRO ;將兩位數字的ASCII碼轉換成二進制數
mov dl,10
lodsb
and al,0fh
mul dl
mov dx,ax
lodsb
and al,0fh
add al,dl
stosb
EndM
; -------------------------------------
; 功能:輸入兩位十進制數,將其保存在指定的內存單元
; 入口:es:di=保存輸入的數字首地址
; 出口:轉換後的二進制數保存在di所指的單元
Input_Dec Proc Near
push cx
push bx
cld
mov cx,2
@@Input_Dec: mov ah,7 ;從鍵盤接受一個字元
int 21h
cmp al,'0'
jb @@Input_Dec ;若低於數字'0',重新輸入
cmp al,'9'
ja @@Input_Dec ;若高於數字'9',重新輸入
stosb ;保存
mov ah,0eh ;顯示這個數字
xor bh,bh
int 10h
loop @@Input_Dec ;接受下一個數字
pop bx
pop cx
ret
Input_Dec EndP
; -------------------------------------
; 功能:把AX中的二進制無符號數轉換成顯式的十進制ASCII碼,並送顯示屏顯示
; 入口:AX=二進制數
; 出口:在當前游標位置顯示轉換後的ASCII碼數字
Unsi_Dec_ASCII Proc Near
push dx
push bx
push di
mov bx,10
lea di,@@Temp_Save[5]
mov BYTE PTR [di],'$'
dec di
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,ax
jnz @@Divide
inc di
push di
pop dx
mov ah,9
int 21h
pop di
pop bx
pop dx
ret
@@Temp_Save db 6 p(?)
Unsi_Dec_ASCII EndP
; -------------------------------------
; 功能:鍵盤輸入一個字元,若輸入的是'y'或'n'(不分大小寫),則顯示並返回
; 入口:無
; 出口:若輸入的是'y',進位標志置位;若輸入的是'n',進位標志復位。
Yes_or_No proc Near
push dx
push ax
@@Input_Chr: mov ah,7 ;不帶回顯的鍵盤輸入
int 21h
mov dl,al
and al,0dfh
cmp al,'Y'
jnz $+5
stc
jmp $+7
cmp al,'N'
jnz @@Input_Chr
clc
mov ah,2
int 21h
pop ax
pop dx
ret
Yes_or_No Endp
; -------------------------------------
; 加法運算
Addition Proc Near
mov ax,WORD ptr Number
add al,ah
xor ah,ah
call Unsi_Dec_ASCII ;顯示和
ret
Addition EndP
; -------------------------------------
; 減法運算
Subtration Proc Near
mov ax,WORD ptr Number
sub al,ah
xor ah,ah
call Unsi_Dec_ASCII ;顯示差
ret
Subtration EndP
; -------------------------------------
; 乘法運算
Multiple Proc Near
mov ax,WORD ptr Number
mul ah
call Unsi_Dec_ASCII ;顯示乘積
ret
Multiple EndP
; -------------------------------------
; 除法運算
Division Proc Near
mov ax,WORD ptr Number
mov bl,ah
xor ah,ah
div bl
push ax
xor ah,ah
call Unsi_Dec_ASCII ;顯示商數的整數部分
mov cx,6 ;寫字元次數
mov al,'.'
mov ah,0eh
@@Write_Dot: int 10h
loop @@Write_Dot
pop ax
xchg ah,al
or al,30h
mov ah,0eh
int 10h
ret
Division EndP
; -------------------------------------
prompt_Str db 13,10,10,'Please input an arithmetical expression:',13,10,'$'
Contin_Str db 13,10,10,'Continue(Y/N)?$'
Number db ?,? ;操作數存儲單元
Operators db '+-*/' ;運算符
Procere dw Addition,Subtration,Multiple,Division
Press_Key db 7,13,10,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
Input_Expre: Output prompt_Str ;提示輸入算術表達式
lea di,Arith_Expre ;算術表達式緩沖區地址
call Input_Dec ;輸入兩位十進制數,將其保存在指定的內存單元
Input_Oper: mov ah,7
int 21h
cmp al,'+'
jz Store_Oper
cmp al,'-'
jz Store_Oper
cmp al,'*'
jz Store_Oper
cmp al,'/'
jnz Input_Oper
Store_Oper: stosb ;保存
mov ah,0eh ;顯示這個數字
xor bh,bh
int 10h
call Input_Dec
mov al,'='
mov ah,0eh
xor bh,bh
int 10h
lea si,Arith_Expre
lea di,Number ;操作數存儲單元地址
ASCII_Binary ;將兩位數字的ASCII碼轉換成二進制數
inc si
ASCII_Binary
mov al,BYTE ptr Arith_Expre[2] ;取運算符
mov cx,4
lea di,Operators
mov bx,di
repnz scasb
xchg di,bx
sub bx,di
dec bx
shl bx,1
call Procere[bx] ;調用相應的運運算元程序
Output Contin_Str
call Yes_or_No
jc Input_Expre
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序
mov ah,1
int 21h
mov ah,4ch ;結束程序
int 21h
Arith_Expre: ;算術表達式緩沖區
Code ENDS
END Start ;編譯到此結束
『玖』 四則運算編程 編譯的時候顯示沒有錯誤 可我一運行發現循環有問題 各位高手幫忙看看 在下感激不盡!
#include<stdio.h>
int a,b,c,j,score=0,num1(),num2(),num3(),d;
float num4(),e;
char op;
void main()
{
while(1)
{
printf("請選擇運算類型:+ - * /\n");
op=getchar();
switch(op)
{
case'+':
score=num1();
break;
case'-':
score=num2();
break;
case'*':
score=num3();
break;
case'/':
score=num4();
break;
}
printf("答對%d題,答錯%d題,得分為%d\n\n繼續做下一套題?(1/0,1為繼續,0為結束)\n\n",score/10,(5-score/10),score);
scanf("%d",&d);
if(d==0)
break;
else
{
srand(a);
getchar();
}
}
}
int num1()
{
int j,rand();
printf("共5題\n");
for(j=1;j<=5;j++)
{
do
{
a=rand();b=rand();
}while(a>99||b>99);
printf("第%d題:%d+%d= \n",j,a,b);
scanf("%d",&c);
if(a+b==c)
score+=10;
}
return score;
}
int num2()
{
int j,rand();
printf("共5題\n");
for(j=1;j<=5;j++)
{
do
{
a=rand();b=rand();
}while(a>99||b>99);
printf("第%d題:%d-%d= \n",j,a,b);
scanf("%d",&c);
if(a-b==c)
score+=10;
}
return score;
}
int num3()
{
int j,rand();
printf("共5題\n");
for(j=1;j<=5;j++)
{
do
{
a=rand();b=rand();
}while(a>99||b>99);
printf("第%d題:%d*%d= \n",j,a,b);
scanf("%d",&c);
if(a*b==c)
score+=10;
}
return score;
}
float num4()
{
int j,rand();
printf("共5題\n");
for(j=1;j<=5;j++)
{
do
{
a=rand();b=rand();
}while(a>99||b>99);
printf("第%d題:%d/%d= \n",j,a,b);
scanf("%f",&e);
if((float)a/b==e)
score+=10;
}
return score;
}
這里在主體函數中 你進行了一個判斷,如果得到1 則繼續進行,如果是0 則停止,那麼再輸入1後 你必須按下 「回車」 此時你必須用getchar() 將其吞並,否則會在while循環體中造成不便, 因為「回車」不是你的運算符號~! 代碼修改過了 希望你聽完解釋能夠明白~!