c语言计算器(源代码)

/*

*dev C++运行通过

*计算器,计算算式格式,可以存在空格,不可存在括号,等号可省略 
*eg:12+12+12/2=
* 12+12+12/2
* 12+12+  12*2等
*有问题希望反馈 
*/ 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
float deal(char deal_char[]);//处理函数,将char型数字转换成float型 
void add(float num[],int t);//将第t个运算符两侧的数字相加  
void reduce(float num[],int t);//将第t个运算符两侧的数字相减 
void ride(float num[],int t);//将第t个运算符两侧的数字相乘 
void divide(float num[],int t);//将第t个运算符两侧的数字相除 
void remove_space(char a[]);//将输入的带有空格的字符串空格去掉,处理成标准易处理的字符串 
int main()
{
while(1){//无退出循环 
int i=0,j=0,k=0,x=0,flag;//数字个数  运算符个数    
/**
*i:循环控制变量
*j:记录c_figure的数据多少 
*k:记录c_figure,填充每一行数据时,由k记录填充到那一项,纵向
*x:记录有多少个运算符,并记录c_operator的填充项
*flag:每次处理一个运算符两侧的数据,flag用于记录某次是否已经处理过数据 
*/ 
char input_char[100],deal_char[20];
/**
*输入的完整的整式记录在input_char中,以字符形式记录 
*处理每一个数字字符串暂存于deal_char中 
*/
float num[20]={0};//储存参加运算的具体数字,已被处理成float型,在num中 
char c_figure[20][20];//将每一char型数字分别存在c_figure每一行中 
char c_operator[20];//运算符 
gets(input_char);//读入一个整式,作为字符串存储 
remove_space(input_char);//去除空格 
while(input_char[i]!='\0'){//将char型数字与运算符分开 
if((input_char[i]>=48&&input_char[i]<=57)||(input_char[i]=='.')){//保证输入的是合法数字,小数点处理为合法 
c_figure[j][k]=input_char[i];
k++;
}
else if(input_char[i]=='+'||input_char[i]=='-'||input_char[i]=='*'||input_char[i]=='/'){//运算符处理 
c_operator[x]=input_char[i];
c_figure[j][k]=0;
j++;
k=0;
x++;
}
else if(input_char[i]=='='){//等号处理,支持没有等号的等式 
input_char[i+1]=0;
c_figure[j][k]=0;
}
i++;
}
c_figure[j][k]=0;
/*
*出现b最大ug之处。已修改,如果没有等号的输入的最后一个数字处理错误! 终于找到了 
*/
if(k==0)j--;//有无等号处理,k==0,无等号 
else;
if(x==j);
else {//判断等式是否输入合法 
printf("input wrong");
exit(0);
}
for(i=0;i<=j;i++){//将char型数字转换成float型 
strcpy(deal_char,c_figure[i]);
num[i]=deal(deal_char);
}
while(x--){//对运算符优先级进行分辨,进行不同处理 
flag=0; //flag为0表示未经过处理,一表示经过处理 
int t;
for(i=0;i<=x&&flag==0;i++){
if(c_operator[i]=='/'){//第二次bug出现地方 
t=i;
divide(num,t);
flag=1;
}
}
for(i=0;i<=x&&flag==0;i++){
if(c_operator[i]=='*'){
t=i;
ride(num,t);
flag=1; 
}
}
for(i=0;i<=x&&flag==0;i++){
if(c_operator[i]=='-'){//第一次bug出现地方 
t=i;
reduce(num,t);
flag=1;
}
}
for(i=0;i<=x&&flag==0;i++){
if(c_operator[i]=='+'){
t=i;
add(num,t);
flag=1;
}
}
for(i=t;i<=x;i++)c_operator[i]=c_operator[i+1];//每进行一次操作,将运算符删除 
}
printf("整式的结果是:%g\n\n",num[0]);//输出结果 
}



void add(float num[],int t)//加法实现
{
int i;
num[t]=num[t]+num[t+1];
for(i=t+1;i<20;i++){
num[i]=num[i+1];
}
return;
}


void reduce(float num[],int t)//减法实现
{
int i;
num[t]=num[t]-num[t+1];
for(i=t+1;i<20;i++){
num[i]=num[i+1];
}
return;
}


void ride(float num[],int t)//乘法实现
{
int i;
num[t]=num[t]*num[t+1];
for(i=t+1;i<20;i++){
num[i]=num[i+1];
}
return;
}


void divide(float num[],int t)//除法实现 
{
int i;
num[t]=num[t]/num[t+1];
for(i=t+1;i<20;i++){
num[i]=num[i+1];
}
return;
}


float deal(char deal_char[])//将char型数字转换成float型 
{
int i=0,flag=0;
float m=0.0,n=1.0;
while(deal_char[i]!=0){
if(deal_char[i]=='.')flag=1;
else if(flag==0){
m=m*10+deal_char[i]-48;
}
else {
m+=(deal_char[i]-48)/(10*n);
n*=10;
}
i++;
}
return(m);
}


void remove_space(char a[])//去除空格 
{
int i,m,j;
while(a[i]!=0){
m=strlen(a);
m++;
if(a[i]==' '){
for(j=i;j<m;j++){
a[j]=a[j+1];
}
}
i++;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值