导航:首页 > 源码编译 > 编译原理进制间的四则运算

编译原理进制间的四则运算

发布时间:2022-07-19 05:49:36

‘壹’ 编译原理具体概念是什么,怎样用词法分析来解决整数的四则运算问题

#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循环体中造成不便, 因为“回车”不是你的运算符号~! 代码修改过了 希望你听完解释能够明白~!

阅读全文

与编译原理进制间的四则运算相关的资料

热点内容
喷油螺杆制冷压缩机 浏览:569
python员工信息登记表 浏览:369
高中美术pdf 浏览:153
java实现排列 浏览:505
javavector的用法 浏览:974
osi实现加密的三层 浏览:225
大众宝来原厂中控如何安装app 浏览:906
linux内核根文件系统 浏览:235
3d的命令面板不见了 浏览:520
武汉理工大学服务器ip地址 浏览:141
亚马逊云服务器登录 浏览:517
安卓手机如何进行文件处理 浏览:65
mysql执行系统命令 浏览:923
php支持curlhttps 浏览:136
新预算法责任 浏览:437
服务器如何处理5万人同时在线 浏览:244
哈夫曼编码数据压缩 浏览:419
锁定服务器是什么意思 浏览:379
场景检测算法 浏览:612
解压手机软件触屏 浏览:343