⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 计算机组成原理的一个浮点数运算器。 C++编写
💻 CPP
字号:

#include <string>
#include <iostream>
#include<String.h>
#include<cstdlib>
#include "fnumber.h"
using namespace std ;

int input_stepcode(string & stepcode)
{
	cout<<"★请输入操作数的阶码: "<<endl;
	cin>>stepcode;
	string s;
	for(int i=0;i<stepcode.length();i++)
	{
		s=stepcode.substr(i,1);
		if(s!="0" && s!="1" && s!="-")
		{
			cout<<"◎输入错误! 输入串只能含有:0 1 负号 请重新输入! "<<endl;
			return 0;
		}
	}
	return 1;  // normal
}

int input_mantissa(string & mantissa)
{
	cout<<"★请输入操作数的尾数: "<<endl;
	cin>>mantissa;
	string s;
	for(int i=0;i<mantissa.length();i++)
	{
		s=mantissa.substr(i,1);
		if(s!="0" && s!="1" && s!="-" &&s!=".")
		{
			cout<<"◎输入错误! 输入串只能含有:0 1 小数点 负号 请重新输入! "<<endl;
			return 0;
		}
	}
	if(mantissa.rfind("-",mantissa.length())>=1&&mantissa.rfind("-",mantissa.length())!=string::npos)  // test -
	{
		cout<<"◎输入的符号位位置不正确. 重新输入!"<<endl;
		return 0;
	}
	if(mantissa.rfind(".",mantissa.length())>=3)
	{
		cout<<"◎输入的小数点位置不正确. 重新输入!"<<endl;
		return 0;
	}
	return 1;  

}

void reverseadd(string& s)//求反加一
{
	int len=s.length();
	for(int i=0;i<len;i++)
	{
		if(s.substr(i,1)=="0")
			s.replace(i,1,"1");
		else
			s.replace(i,1,"0");
	}
	while(len>0)
	{
		if(s.substr(len-1,1)=="0")
		{
			s.replace(len-1,1,"1");
			break;
		}
		else
			s.replace(len-1,1,"0");
		len--;
	}
}

int main(int argc, char* argv[])
{
	string result;  //save 运算结果
	string operation ;// save 运算符
	int stepcodebit;   // save 阶码位数
	int mantissabit;  //save 尾数位数

	
	cout<<endl;
	cout<<"            **************************************************"<<endl;
    cout<<"            *                                                *"<<endl;
	cout<<"            *                  浮点数运算器                  *"<<endl;
	cout<<"            *                                                *"<<endl;
    cout<<"            **************************************************"<<endl;
	cout<<endl;
	cout<<endl;
    cout<<endl;
    cout<<endl;
	
	
	
	cout<<"★请输入阶码位数: "<<endl;
	cin>>stepcodebit;
	cout<<"★请输入尾数位数: "<<endl;
	cin>>mantissabit;
	cout<<endl;

   string   s1;// stepcode
   string   s2; //mantissa

	int i;
	while(1)  //first number
	{
		if(i=input_stepcode(s1)==1)
			break;
	}
		// mantissa input
	while(1)
	{
		if(i=input_mantissa(s2)==1)
			break;
	}

	cout<<"★请输入运算符(+ or -): ";
	cin>>operation;
    while(operation!="+"&&operation!="-")
	{
		cout<<"◎请重新输入!";
		cout<<"★请输入运算符(+ or -): ";
	    cin>>operation;
	}

	// number 2 input
	string s3;
	string s4;
	while(1)  //first number
	{
		if(i=input_stepcode(s3)==1)
			break;
	}
		// mantissa input
	while(1)
	{
		if(i=input_mantissa(s4)==1)
			break;
	}
	//if mantissa is zero 
	if(s2.find("1",0)==string::npos)
	{
        result.insert(0,"阶码:");
		result.insert(result.length(),s3);
		result.insert(result.length(),"尾数:");
        result.insert(result.length(),s4);
		cout<<result<<endl;
		return 0;
	}
   
	if(s4.find("1",0)==string::npos)
	{
        result.insert(0,"阶码:");
		result.insert(result.length(),s1);
		result.insert(result.length(),"尾数:");
        result.insert(result.length(),s2);
		cout<<result<<endl;
		return 0;
	}

	// construct  number 1
    int jsign;
	int wsign;
	if(s1.substr(0,1)=="-")
	{	
		jsign=1;
		s1.erase(0,1);
	}
	else 
		jsign=0;

	// deal mantissa
	if(s2.substr(0,1)=="-")
	{
       s2=s2.substr(3,s2.length()-3);
	   wsign=1;
	}
	else
	{
      s2=s2.substr(2,s2.length()-2);
	  wsign=0;
	}
	
	fnumber op1(stepcodebit,mantissabit,jsign,s1,wsign,s2);

	// construct number 2

	if(s3.substr(0,1)=="-")
	{	
		jsign=1;
		s1.erase(0,1);
	}
	else 
		jsign=0;

	// deal mantissa
	if(s4.substr(0,1)=="-")
	{
		if(operation=="+")
          wsign=1;
		else
			wsign=0;
       s4=s4.substr(3,s4.length()-3);
	   
	}
	else
	{
		if(operation=="+")
          wsign=0;
		else
			wsign=1;
      s4=s4.substr(2,s4.length()-2);
	  
	}

	fnumber op2(stepcodebit,mantissabit,jsign,s3,wsign,s4);

	///begin  operating
    // rectify_stepcode 
	int d;
	d=op1.rectify_stepcode(op2);
	if(d==1)
	{
        result.insert(0,"阶码:");
        string temp=op2.stepcode;

		if(temp.substr(0,1)=="1")
		{
		     reverseadd(temp);
            result.insert(result.length(),"-");
		
		}

     result.insert(result.length(),temp.substr(2,temp.length()-2));
	
     result.insert(result.length(),"尾数:");
	   temp=op2.mantissa;
	   if(temp.substr(0,1)=="1")
		{
		   reverseadd(temp);
           result.insert(result.length(),"-");
		}

        result.insert(result.length(),temp.substr(2,temp.length()-2));
        cout<<result<<endl;
		return 0;
	}
	else if(d==2)
       {
        result.insert(0,"阶码:");
        string temp=op1.stepcode;

		if(temp.substr(0,1)=="1")
		{
		     reverseadd(temp);
            result.insert(result.length(),"-");
		
		}

        result.insert(result.length(),temp.substr(2,temp.length()-2));
		//result.insert(result.length(),op1.stepcode);
		result.insert(result.length(),"尾数:");
        temp=op1.mantissa;
	   if(temp.substr(0,1)=="1")
		{
		   reverseadd(temp);
           result.insert(result.length(),"-");
		}

        result.insert(result.length(),temp.substr(2,temp.length()-2));
        cout<<result<<endl;
		return 0;
	  } 

	//mantissa addition
	fnumber op3=op1.mantissaaddition(op2);
	 
	//standardize
	d=op3.standardize();
	if(d==1)
	{
		  result="+∞";
	      cout<<result<<endl;
		  return 0;
	}
	else if(d==-1)
	{
		  result="-∞ ";
	      cout<<result<<endl;;
		  return 0;
	}
	string temp=op3.stepcode;

	result.insert(0,"阶码:");
	if(temp.substr(0,1)=="1")
		{
		    reverseadd(temp);
            result.insert(result.length(),"-");
		
		}
     result.insert(result.length(),temp.substr(2,temp.length()-2));
     
	 result.insert(result.length(),"尾数:");
     temp=op3.mantissa;
    if(temp.substr(0,1)=="1")
		{
		   reverseadd(temp);
           result.insert(result.length(),"-");
		}
	result.insert(result.length(),temp.substr(2,temp.length()-2));
        
   cout<<result<<endl;

    return 0;

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -