搜档网
当前位置:搜档网 › C语言实现的计算器(无限位)

C语言实现的计算器(无限位)

#include
#include
#include
using namespace std;

void plus(char *number1,char *number2);//加法函数声明
void minus(char *number1,char *number2);//减法函数声明
void times(char *number1,char *number2);//乘法函数声明
void divide(char *number1,char *number2);//除法函数声明

int Check(char *number1);//检验输入的是否全部是数字

char *plus_sum;//存放两数之和
char *minus_sum;//存放两数之差
char *times_sum;//存放两数里各项之积,最后加在一起就是,并且屏蔽全局变量
char *divide_sum;//存放两数里各项之积,最后加在一起就是,并且屏蔽全局变量

int main(int argc, char **argv)
{
if(argc<3)//判断命令行输入的是否符合输入要求
{
cout<<"注:该程序的输入是在命令行里进行的!"<cout<<"编写程序过程中也可以在菜单中选择project里的settings,找到Debug一栏,"<<<"在Program arguments里输入两个数,用空格分开,返回运行。"<
cout<<"你输入的格式应该为:"<exit(1);
}
//////////////////////////////////////////////////////////////////////////////////
/*
注意:如果你不想用命令行的话,就将上面的代码:

if(argc<3)//判断命令行输入的是否符合输入要求
{
cout<<"注:该程序的输入是在命令行里进行的!"<cout<<"编写程序过程中也可以在菜单中选择project里的settings,找到Debug一栏,"<<<"在Program arguments里输入两个数,用空格分开,返回运行。"<
cout<<"你输入的格式应该为:"<exit(1);
}

换成:

argv[1]="1111111";
argv[2]="2222222";

换了以后可以将argv[1]、argv[2]后面的数字随意初始化既可。
*/
/////////////////////////////////////////////////////////////////////////////////
if( Check(argv[1])==0 || Check(argv[2])==0 )//Check输入的两个数字字符串是否符合要求
{
cout<system("pause");//显示“任意键继续......”
exit(1);
}

for(int is_0_1=0; argv[1][is_0_1]; is_0_1++) { if(argv[1][is_0_1]!='0') break; }//过滤‘0’
for(int is_0_2=0; argv[2][is_0_2]; is_0_2++) { if(argv[2][is_0_2]!='0') break; }//过滤‘0’

if(argv[1][is_0_1]==0 && argv[2][is_0_2]==0)
{
is_0_1=0;
is_0_2=0;
cout<cout<cout<cout<cout<cout<cout<cout<<}

else if(argv[1][is_0_1]!=0 && argv[2

][is_0_2]==0)
{
is_0_1=0;
cout<cout<cout<cout<cout<cout<cout<cout<<}

else if(argv[1][is_0_1]==0 && argv[2][is_0_2]!=0)
{
cout<cout<cout<cout<cout<cout<cout<cout<<}

else
{
cout<plus (argv[1]+is_0_1,argv[2]+is_0_2);//计算两个字符串之和
cout<
cout<minus (argv[1]+is_0_1,argv[2]+is_0_2);//计算两个字符串之差
cout<
cout<times (argv[1]+is_0_1,argv[2]+is_0_2);//计算两个字符串之积
cout<
cout<else plus_sum[0]=' ';//如果不要进位,则plus_sum[0]="空格"

cout<}

void minus(char *number1,char *number2)//减法函数定义
{
int longer;//longer用来表示number1和number2中最长的大小
int sum_length;//表示两数之差的长度
int length1;//表示number1的长度
int length2;//表示number2的长度
int is_bigger;
int is_borrow=0;//is_borrow表示是否借位

longer=strlen(number1)>strlen(number2) ? strlen(number1):strlen(number2);//longer用来表示number1和number2中最长的大小

minus_sum=new char[longer+2];//建立内存缓冲区
minus_sum[longer+1]=0;

sum_length = longer;
length1 = strlen(number1)-1;//让length1指向number1最末尾
length2 = strlen(number2)-1;//让length2指向number2最末尾

if(strlen(number1)>strlen(number2)) is_bigger=1;//判断number1和number2哪个长,number1比number2长则为true(1),否则为false(0)
else if(strlen(number1)==strlen(number2))
{
for(int i=0; i{
if( number1[i]-number2[i]>0 )
{
is_bigger = 1;
break;
}
else if( number1[i] == number2[i] )
{
if( i==strlen(number1)-1 ) //当两个字符串相等的时侯
{
minus_sum[0] = '0';
cout<}
else is_bigger=1;
}
else
{
is_bigger=0;
break;
}
}
}
else is_bigger=0;
for( sum_length = longer; sum_length >=1; sum_length --)
{
if(length1>=0 && length2>=0) //当number1和number都有的时候
{
if(is_bigger==1)
{
minus_sum[sum_length] = (number1[length1]-'0') - (number2[length2]-'0') - is_borrow;
}
else
{
minus_sum[sum_length] = (number2[length2]-'0') - (number1[length1]-'0') - is_borrow;
}
length1--;
length2--;
}
else //当只有number1或者number2的时候
{
if(is_bigger==1)
{
if(length1>=0){ minus_sum[sum_length] = (number1[length1]-'0') - is_borrow; length1--; }//当只有number1的时候
}
else
{
if(length2>=0){ minus_sum[sum_length] = (number2[length2]-'0') - is_borrow; length1--; }//当只有number2的时候
}
}

if(minus_sum[sum_length]<0)//当minus_sum[sum_length]<0时,要加上10
{
minus_sum[sum_length]+=10;//加上10
is_borrow=1;//表示要向上一位借1
}
else
{
is_borrow=0;//表示不向上一位借1
}

minus_sum[sum_length]+='0';//变回字符型
}

for(int is_0_ =1; minus_sum[is_0_]; is_0_ ++)
{
if(minus_sum[is_0_]!='0')
break;
}
if(is_bigger==0)
{
cout<<'-'<}
else
{
cout<<' '<

s_sum +is_0_ ;//输出
}
}

void times(char *number1,char *number2)//乘法函数定义
{
int Sum_length;//表示两数之积的长度
int length1;
int length2;
int jinwei;

Sum_length=strlen(number1)+strlen(number2);//表示两数之积的长度

times_sum=new char[Sum_length+1];//建立内存缓冲区
times_sum[Sum_length]='\0';

length1=strlen(number1);//表示number1的长度
length2=strlen(number2);//表示number2的长度

for(int i=length2-1; i>=0; i--)
{
jinwei=0;
for(int j=length1-1; j>=0; j--)
{
if(times_sum[j+i+1]>='0' && times_sum[j+i+1]<='9')
{
times_sum[j+i+1]=(times_sum[j+i+1]-'0') + (number2[i]-'0') * (number1[j]-'0') + jinwei;
}
else
{
times_sum[j+i+1]=(number2[i]-'0') * (number1[j]-'0') + jinwei;
}
///////////////////////////////////////
if(times_sum[j+i+1]>9)
{
jinwei=times_sum[j+i+1]/10;
times_sum[j+i+1]%=10;
}
else
{
jinwei=0;
}

times_sum[j+i+1]+='0';
}

if(jinwei==0);
else times_sum[j+i+1]=jinwei+'0';
}

if( jinwei==0 ) times_sum[0] = ' ';
else times_sum[0] = jinwei + '0';

cout<}

/*对于除法,在下面我已经写了一些残码,只是现在有其他的事情要做,就不写出来了
其实算法就是根据实际的除法原理去做就行了,也可以参照我写的上述三种里的思想类
比着去写,只是要注意出的时候要加上六位小数,毕竟除出来的数多数不是整数。*/
void divide(char *number1,char *number2)//除法函数定义
{
char *sum_temp;
int Sum_length;//表示两数之积的长度
int length1;
int length2;

Sum_length = strlen(number1) - strlen(number2) +1+1+6 ; //
length1 = strlen(number1);//表示number1的长度
length2 = strlen(number2);//表示number2的长度

divide_sum = new char[Sum_length+1] ; //建立内存缓冲区
divide_sum[Sum_length]= '\0' ;

sum_temp = new char[length2+2] ; //建立内存缓冲区
sum_temp[length2+1] = '\0' ;

for( int i = 0 ; divide_sum[i]!='\0' ; i++ )//
{
if(i==Sum_length-7)
{
divide_sum[i]='.';
}
else
{
divide_sum[i]='0';
}
}
/*cout<for(int k=0; k<=length2; k++)
{
if(k==0)sum_temp[k]=' ';
else sum_temp[k]=number1[k-1];
}
/*cout</*cout<for(int j = 0; j < Sum_length ; j++)
{
if(divide_sum[j]=='.'){}
else
{
/* bool if_over_0=true;
for(int temp_i=0; temp_i{
temp_i[temp_i]=temp_i[temp_i+1];
}
temp_i[temp_i]=temp_i[temp_i+1];
while(if_over_0)
{
if( strcmp(sum_temp,number2) );
//sum_temp=if_over_0;
divide_sum[j]+=if_over_0;
}
*/
}
}

}

int Check(char *number1)
{
int i,j=0;/*这里的j是为了考虑+,-时用的,不考虑的话只用i就可以了
正负暂时没有时间,就留给大家去做了if((number1[0]=='-')||

(number1[0]=='+')) j=1;
提示:和这里的做法相似,只须将j取值为1,符号单独考虑就可以了*/
for(i=j;i{
if(number1[i]<'0'||number1[i]>'9')/*返回false代表不全是数字*/
{
return 0;
}
}
return 1;
}









相关主题