VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 218|回复: 0

求教,问个习题,谢谢

[复制链接]
06_avatar_middle
最佳答案
0 
在线会员 发表于 2020-5-28 22:23:59 | 显示全部楼层 |阅读模式
教材是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远控是什么语言编写的?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-8-6 06:34

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表