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

📄 floatcalculator.cpp

📁 哈工大 计算机学院 组成原理大作业 运用程序模拟浮点数的运算 1. 用户输入十进制的阶码和尾数 2. 根据浮点运算的法则进行运算。 3. 浮点四则运算:加减法可以使用同一种对阶方法
💻 CPP
字号:
// FloatCalculator.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include "iostream.h"
#include "process.h"


//--------------------------------------------------------------------------------------
//定义结构体,用来存储运算中间变量
//--------------------------------------------------------------------------------------
struct data
{
    float s;	//尾数
    long j;		//阶数
};
typedef struct data MyData;


//--------------------------------------------------------------------------------------
// 主要的过程函数的声明
//--------------------------------------------------------------------------------------
void MainMenu();										// 主菜单 
MyData Add(MyData op1,MyData op2);		//加法运算 
MyData Sub(MyData op1,MyData op2);		//减法运算 
MyData Mul(MyData op1,MyData op2);		//乘法运算 
MyData Div(MyData op1,MyData op2);		//除法运算 
MyData checkData(MyData checkdata);		//判断结果是否溢出,并把结果变为规格化数



//--------------------------------------------------------------------------------------
//主函数
//--------------------------------------------------------------------------------------
int main()							
{ 
	MyData op1,op2,data_new,l_data1,l_data2;
	char command;					//操作命令字符
	char ch;
	do
	{ 
		do
		{	
			MainMenu();				//调用Menu函数打印菜单
			cin>>command;		//赋值操作命令字符,用于指定操作的种类
		}
		while((command!='a')&&(command!='A')
			&&(command!='s')&&(command!='S')
			&&(command!='m')&&(command!='M')
			&&(command!='d')&&(command!='D')
			&&(command!='q')&&(command!='Q'));
		do
		{
			if(command=='a' || command=='A')					//根据command值的不同确定不同的输入提示
				cout << "请输入被加数Operator_1:\n";			//被 加 减 乘 除 数 Operator_1
			else if(command=='s' || command=='S')
				cout << "请输入被减数Operator_1:\n";
			else if(command=='m' || command=='M')
				cout << "请输入被乘数Operator_1:\n";
			else if(command=='d' || command=='D')
				cout << "请输入被除数Operator_1:\n";
			
			cout << "输入Operator_1的尾数:";
			cin >>l_data1.s;
			cout << "输入Operator_1的阶数:";
			cin >> l_data1.j;
			if(l_data1.j>32767||l_data1.j<-32768)
				cout << "输入的阶数超过固有范围,请重新输入!\n";
		}while(l_data1.j>32767||l_data1.j<-32768);
		op1.j=(int)l_data1.j;
		op1.s=l_data1.s;
		do
		{													
			if(command=='a' || command=='A')			//根据command值的不同确定不同的提示
				cout << "请输入加数Operator_2:\n";			//被 加 减 乘 除 数 Operator_2
			else if(command=='s' || command=='S')
				cout << "请输入减数Operator_2:\n";
			else if(command=='m' || command=='M')
				cout << "请输入乘数Operator_2:\n";
			else if(command=='d' || command=='D')
				cout << "请输入除数Operator_2:\n";
			cout<< "输入Operator_2的尾数:";
			cin>>l_data2.s;
			cout<<"输入Operator_2的阶数:";
			cin>>l_data2.j;
			if(l_data2.j>32767||l_data2.j<-32768)
				cout << "输入的阶数超过固有范围,请重新输入!\n";
		}while(l_data2.j>32767||l_data2.j<-32768);
		op2.j=(int)l_data2.j;
		op2.s=l_data2.s;
		
		if(command=='a' || command=='A')						//根据command值的不同确定输出的结果
		{																		
			data_new= Add(op1,op2);
			cout << "Operator_1+Operator_2的结果为:\n";		// 加法 Operator_1+Operator_2
		}
		else if(command=='s' || command=='S')
		{
			data_new= Sub(op1,op2);
			cout << "Operator_1-Operator_2的结果为:\n";		// 减法 Operator_1-Operator_2
		}
		else if(command=='m' || command=='M')
		{
			data_new= Mul(op1,op2);
			cout << "Operator_1*Operator_2的结果为:\n";		// 乘法 Operator_1 * Operator_2
			
		}
		else if(command=='d' || command=='D')
		{
			data_new= Div(op1,op2);
			cout << "Operator_1/Operator_2的结果为:\n";		// 除法 Operator_1 / Operator_2
			
		}
		cout << "尾数为:"<< data_new.s << "  阶码为:" << data_new.j<<"\n";
		cout <<" 继续?(Y/N)注:不区分大小写";
		cin>>ch;
		if(ch=='N' || ch =='n')
			return 0;
		system("cls");															//	调用system清屏函数
	}while((command!='q')&&(command!='Q'));
	return 0;
}


//--------------------------------------------------------------------------------------
//以下是主要过程的函数的实现
//--------------------------------------------------------------------------------------
// 显示主菜单,以及响应的提示
//--------------------------------------------------------------------------------------
void MainMenu()
{  
	cout<<"--------------------------------------------"<<endl;
	cout<<"本程序用十进制,基数10,阶码在-32768~32767 |"<<endl;	
	cout<<"--------------------------------------------"<<endl;
 	cout<<"加法(A)\t减法(S)\n乘法(M)\t除法(D)\n退出(Q)\t";
    cout<<"备注:不区分大小写"<<endl;
    cout<<"--------------------------------------------"<<endl;
	cout<<"请按键选择操作:";
}



//--------------------------------------------------------------------------------------
//加法过程
//--------------------------------------------------------------------------------------
MyData Add(MyData op1,MyData op2)				
{   
	int j;
	MyData result;
	if(op1.s==0)
	{
		result.s=op2.s;
		result.j=(long)op2.j;
		result=checkData(result);
		op2.s=result.s;
		op2.j=(int)result.j;
		return op2;
	}
	else if(op2.s==0)
	{
		result.s=op1.s;
		result.j=(long)op1.j;
		result=checkData(result);
		op1.s=result.s;
		op1.j=(int)result.j;
		return op1;
	}
	else
	{
		if(op1.j!=op2.j)
		{							//求阶差j,保留大阶,小阶的尾数右移j位
			if(op1.j>op2.j)
			{
				j=op1.j-op2.j;
				do
				{
					op2.s=op2.s/10;
					j--;
				}while(j!=0);
			}
			else
			{
				j=op2.j-op1.j;
				do{
					op1.s=op1.s/10;
					j--;
				}while(j!=0);
				op1.j=op2.j;
			}
		}
			result.s=op1.s+op2.s;	//尾数相加	
		result.j=(long)op1.j;
		result=checkData(result);
		op1.j=(int)result.j;
		op1.s=result.s;
		return op1;						//返回结果
	}
}


//--------------------------------------------------------------------------------------
//减法过程
//--------------------------------------------------------------------------------------
MyData Sub(MyData op1,MyData op2)				
{   
	int j;
	MyData result;
	if(op1.s==0)
	{
		result.s=0-op2.s;
		result.j=(long)op2.j;
		result=checkData(result);
		op2.s=result.s;
		op2.j=(int)result.j;
		return op2;
	}
	else if(op2.s==0)
	{
		result.s=op1.s;
		result.j=(long)op1.j;
		result=checkData(result);
		op1.s=result.s;
		op1.j=(int)result.j;
		return op1;
	}
	else
	{
		if(op1.j!=op2.j)
		{   //求阶差j,保留大阶,小阶的尾数右移j位
			if(op1.j>op2.j)
			{
				j=op1.j-op2.j;
				do
				{
					op2.s=op2.s/10;
					j--;
				}while(j!=0);
			}
			else
			{
				j=op2.j-op1.j;
				do{
					op1.s=op1.s/10;
					j--;
				}while(j!=0);
				op1.j=op2.j;
			}
		}
		//尾数相减
		result.s=op1.s-op2.s;
		result.j=(long)op1.j;
		result=checkData(result);
		op1.j=(int)result.j;
		op1.s=result.s;
		return op1;
	}
}


//--------------------------------------------------------------------------------------
//乘法过程
//--------------------------------------------------------------------------------------
MyData Mul(MyData op1,MyData op2) 	
{   
	MyData result;
	if(op1.s==0||op2.s==0)
	{
		op1.s=0;
		op1.j=0;
		return op1;
	}
	result.j=op1.j+op2.j;
	result.s=op1.s*op2.s;
	result=checkData(result);
	op1.j=(int)result.j;
	op1.s=result.s;
	return op1;
}



//--------------------------------------------------------------------------------------
//除法过程
//--------------------------------------------------------------------------------------
MyData Div(MyData op1,MyData op2)	
// 返回MyData型数据op1,且op1=op1/op2 
{   
	MyData result;
	if(op1.s==0)
	{
		op1.j=0;
		return op1;
	}
	if(op2.s==0)
	{
		cout<<"除数为0!"<<endl;
			return op2;
	}
	result.j=op1.j-op2.j;
	result.s=op1.s/op2.s;
	result=checkData(result);
	op1.j=(int)result.j;
	op1.s=result.s;
	return op1;
}


//--------------------------------------------------------------------------------------
//规格化数函数
//--------------------------------------------------------------------------------------

MyData checkData(MyData checkdata)	
{
	//若尾数全为“0”,则置机器0。
    if(checkdata.s==0)
    {
		checkdata.j=0;
    }
	else
	{
	while(checkdata.s>=1||checkdata.s<=-1)          //判断尾数是否大于1或小于-1,是的话就要右规格化
	{
		checkdata.s=checkdata.s/10;
		checkdata.j++;			
	}
	while(checkdata.s>-0.1 && checkdata.s<0.1)              //判断尾数是否为规格化数,若不是则左规												
	{ 
		checkdata.s=checkdata.s*10;
		checkdata.j--;			
	}
	if(checkdata.j>32767)									//阶码大于32767即为上溢,进行容错处理。
		cout<<"上溢!"<<endl;
	if(checkdata.j<=-32768)							  //阶码小于-32768即为下溢,置机器0。
	{
		cout<<"下溢!"<<endl;
		checkdata.s=0;
		checkdata.j=0;
	}   
	}
	return checkdata;
}


//--------------------------------------------------------------------------------------
//                 哈工大(威海) 计算机学院 
//                        信息安全2班
//					 050420210  常昊宇
//--------------------------------------------------------------------------------------



⌨️ 快捷键说明

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