📄 floatcalculator.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 + -