|
教材是cpp大学教程第5版,课后8.28题,要求在8.18题基础添加新功能,我对其中f小题一直没有头绪,想不出解决办法
f小题要求即可以处理整数又可以处理浮点数,可以按8.18要求不是用100个整数数组来模拟内存吗 想不出下手办法 难道要把整数数组改成浮点数组吗
麻烦看下
这是8.18题目
//这是我8.18题的解
#include <iostream>
#include <cstdio>
using namespace std;
class Csml
{
private:
size_t SMLEIP=0; //要执行的指令
int SMLADD; //累加寄存器
static int const MEMMAX100=100; //内存最大值
int smlmem[MEMMAX100]={0}; //SML计算机内存
bool isexit=false; //全局退出标志
int SMLMAX=+9999; //SML最大数
int SMLMIN=-9999; //SML最少值
//指令编号
enum emSmlOrder
{
SMLBEGIN=0,READ=10,WRITE=11,LOAD=20,STORE=21,ADD=30,SUBTRACT=31,
DIVIDE=32, MULTIPLY=33,BRANCH=40,BRANCHNEG=41,BRANCHZERO=42,
HALT=43 ,SMLEND=HALT+10
};
//错误编号
enum emSMLERROR{ordererror=1,memerror=2,zeroerror=3,memoverstep=4,smloverflow=5};
void enterorders(); //用户指令集
bool ismemF(int); //是否是 合法SML内存数
bool isorderF(int); //判断是否是SML指令
void printerrorF(int);//发生错误时提示错误信息
void printorder(int ,int );//对指令进行解释
void exeordersF(); //开始执行指令
void smlread(int ); //读取到内存
void smlwrite(int ); //写到屏幕
void smlloadF(int );
void smlstoreF(int);
void smladdF(int );
void smlsubtractF(int);
void smldivideF(int);
void smlmultiplyF(int);
void smlbranceF(int);
void smlbranchnegF(int);
void smlbranchzero(int);
void smlhalt();
public:
Csml();
};
Csml::Csml()
{
enterorders();
}
//用户输入一堆指令后再输入-1才开始执行
void Csml::enterorders()
{
cout<<"请输入第1条 指令(输入-1结束输入 并开始执行指令):"<<endl;
cout<<"-->:";cin>>SMLADD;
int i=0;
while(SMLADD!=EOF && isexit==false){
int a=SMLADD/MEMMAX100; //得到前面2位
int b=SMLADD%MEMMAX100; //得到后面2位
bool isnum=!ismemF(b);bool isorder=!isorderF(a);
if(isorder || isnum){ //指令或内存操作数错误
while(isorder){ //如果是指令错误
printerrorF(ordererror);
cout<<"请重新输入指令:";
cout<<"-->:";cin>>SMLADD;
a=SMLADD/MEMMAX100; //得到前面2位
isorder=!isorderF(a);
}
while(isnum){ //如果是内存操作数错误
printerrorF(memerror);
cout<<"请重新内存数:";
cout<<"-->:";cin>>SMLADD;
b=SMLADD%MEMMAX100; //得到后面2位
isnum=!ismemF(b);
}
}
smlmem=SMLADD; //将合法指令加载到内存中
if(i<MEMMAX100){
i++;
cout<<"请输入第" <<(i+1) << " 指令(输入-1结束输入 并开始执行指令):" <<endl;
cout<<"-->:";cin>>SMLADD;
}else{
printerrorF(memoverstep);
smlhalt();
}
}
if(SMLADD==-1) exeordersF();
}
//判断是否是SML指令
bool Csml::isorderF(int value)
{
bool istmp=false;
istmp=(value<=SMLBEGIN || value>=SMLEND);
if(istmp) return false;
switch(value){
case READ:
case WRITE:
case LOAD:
case STORE:
case ADD:
case SUBTRACT:
case MULTIPLY:
case BRANCH:
case BRANCHNEG:
case BRANCHZERO:
case HALT:
istmp=true;break;
default:
istmp=false;break;
}
return istmp;
}
////是否是 合法SML内存数
bool Csml::ismemF(int value)
{
return (value>=0 && value<MEMMAX100);
}
//发生错误时提示错误信息
void Csml::printerrorF(int value)
{
switch(value){
case ordererror:
cout<<"非法指令,请修改"<<endl;break;
case memerror:
cout<<"该内存数超出范围"<<endl;break;
case zeroerror:
cout<<"除数为0错误"<<endl;break;
case memoverstep:
cout<<"输入指令数超出内存范围,无法进行下去\n程序终止"<<endl;break;
case smloverflow:
cout<<"数值超出溢出,超出范围"<<endl;break;
}
}
//对指令进行解释
void Csml::printorder(int a,int b)
{
switch(a){
case READ:
cout<<"读取键盘值到"<<b<<"处的值到内存中";break;
case WRITE:
cout<<"把内存中"<<b<<"处值写到屏幕"<<endl;break;
case LOAD:
cout<<"把内存 "<<b<<" 中数加载累加寄存器中"<<endl;break;
case STORE:
cout<<"把累加寄存器的值写入到内存 "<<b<<" 中"<<endl;break;
case ADD:
cout<<"把内存"<<b<<"处值和累加寄存器值相加保存到累加寄存器"<<endl;break;
case SUBTRACT:
cout<<"累加寄存器的值减去内存"<<b<<"中的值 并保存到累加寄存器"<<endl;break;
case DIVIDE:
cout<<"累加寄存器的值除以指定内存"<<b<<" 的值 并保存到累加寄存器"<<endl;break;
case MULTIPLY:
cout<<"累加寄存器的值乘以指定内存"<<b<<" 的值并保存到累加寄存器"<<endl;break;
case BRANCH:
cout<<"无条件跳转到内存"<<b<<"处"<<endl;break;
case BRANCHNEG:
cout<<"累加寄存器的值为负值时跳转"<<endl;break;
case BRANCHZERO:
cout<<"累加寄存器的值为零时跳转"<<endl;break;
case HALT:
cout<<"遇到结束指令"<<endl;break;
}
}
//执行指令
//读取指令函数
void Csml::smlread(int a)
{
cout<<"请输入一个值:";
cin>>SMLADD;
while(SMLADD<SMLMIN || SMLADD>SMLMAX ){
printerrorF(smloverflow);
cout<<"请输入一个值:";
cin>>SMLADD;
}
smlmem[a]=SMLADD;
SMLEIP++;
}
//显示内存值到屏幕
void Csml::smlwrite(int a)
{
SMLADD=smlmem[a];
cout<<SMLADD<<endl;
SMLEIP++;
}
//读取拇内存的值
void Csml::smlloadF(int a)
{
SMLADD=smlmem[a];
SMLEIP++;
}
//保存值到内存中
void Csml::smlstoreF(int a)
{
smlmem[a]=SMLADD;
SMLEIP++;
}
//加法
void Csml::smladdF(int a)
{
SMLADD=SMLADD+smlmem[a];
if(SMLADD>SMLMAX){
printerrorF(smloverflow);
smlhalt();
}else
SMLEIP++;
}
void Csml::smlsubtractF(int a)
{
SMLADD=SMLADD-smlmem[a];
if(SMLADD<SMLMIN){
printerrorF(smloverflow);
smlhalt();
}else
SMLEIP++;
}
//除法
void Csml::smldivideF(int a)
{
if(smlmem[a]==0) { //除0错误
printerrorF(zeroerror);
smlhalt();
}else if(SMLADD<SMLMIN){ //商如果小于最小值
printerrorF(smloverflow);
smlhalt();
}else{
SMLADD=SMLADD/smlmem[a];
SMLEIP++;
}
}
//乘法
void Csml::smlmultiplyF(int a)
{
SMLADD=SMLADD*smlmem[a];
if(SMLADD>SMLMAX){ //积如果超出最大值
printerrorF(smloverflow);
smlhalt();
}else
SMLEIP++;
}
//无条件跳转
void Csml::smlbranceF(int a)
{
SMLEIP=a;
}
//累加器为负数跳转
void Csml::smlbranchnegF(int a)
{
if(SMLADD<0) SMLEIP=a;
}
//累加咕咕为0跳转
void Csml::smlbranchzero(int a)
{
if(SMLADD==0) SMLEIP=a;
}
void Csml::smlhalt()
{
cout<<"----程序运行结束----"<<endl;
isexit=true;
}
//执行指令集
void Csml::exeordersF()
{
cout<<"------------开始执行指令----------------\n";
int tmp;
while(isexit==false){
tmp=smlmem[SMLEIP]; //将合法指令加载累加寄存器
int a=tmp/MEMMAX100 ; //得到前面2位
int b=tmp%MEMMAX100 ; //得到后面2位
switch(a){ //根据指令调用对应函数
case READ:
smlread(b);break;
case WRITE:
smlwrite(b);break;
case LOAD:
smlloadF(b);break;
case STORE:
smlstoreF(b);break;
case ADD:
smladdF(b);break;
case SUBTRACT:
smlsubtractF(b);break;
case DIVIDE:
smldivideF(b);break;
case MULTIPLY:
smlmultiplyF(b);break;
case BRANCH:
smlbranceF(b);break;
case BRANCHNEG:
smlbranchnegF(b);break;
case BRANCHZERO:
smlbranchnegF(b);break;
case HALT:
smlhalt();break;
}
}
}
int main()
{
Csml mysml;
return 0;
}
|
上一篇: 实用c++41课父类对象和子类对象相互转换下一篇: ghost远控是什么语言编写的?
|