C语言实现简易计算器,能够显示每一步的计算过程

   日期:2020-05-30     浏览:127    评论:0    
核心提示:#includeconst int maxn=1e6+7;char s[maxn];int len;// 开全局变量// 这个函数能够返回表达式中乘除 的位置,如果没有就返回-1int local1() { int pos=-1; for(int i=1 ; i<=len ; i++) { if(s[i]==*||s[i]==/) { pos=i; break; } } return pos;}// 这个函数c/c++
#include<bits/stdc++.h>
const int maxn=1e6+7;
char s[maxn];
int len;
// 开全局变量
// 这个函数能够返回表达式中乘除 的位置,如果没有就返回-1
int local1() {
	int pos=-1;
	for(int i=1 ; i<=len ; i++) {
		if(s[i]=='*'||s[i]=='/') {
			pos=i;
			break;
		}
	}
	return pos;
}
// 这个函数能够返回表达式中加减的位置,如果没有就返回-1
int local2() {
	int pos=-1;
	for(int i=1 ; i<=len ; i++) {
		if(s[i]=='+'||s[i]=='-') {
			pos=i;
			break;
		}
	}
	return pos;
}
//这个函数能够 把 字符串数组中的 pos1到pos2位置的 数字 转化成int 类型 方便加减乘除的计算
int f(int pos1,int pos2) {
	int sum=0;
	for(int i=pos1 ; i<=pos2 ; i++) {
		if(s[i]<='9'&&s[i]>='0') sum=sum*10+(s[i]-'0');
	}
	return sum;
}
// 这个函数能够返回一个整数有多少位
int g(int x) {
	int sum=0;
	while(x>0) {
		sum++;
		x/=10;
	}
	return sum;
}
int main() {
	while(1)
	{
		
	printf("请输入计算表达式:\n");
	scanf("%s",s+1);//输入计算表达式 , 字符串形式全部输入
	// s+1 使字串的起始位置的索引为1
	while(1) {
		len=strlen(s+1);
		// strlen函数统计字符串s 的长度
		int pos=local1();
		if(pos==-1) break;   // 说明 表达式中不含有乘除号了
		int pos1=0,pos2=len+1;  // 这里一定要初始化,因为可能超过边界
		// 从这个符号的位置往前,找到另一个符号,。 这两个符号中间一定夹着一个整数
		for(int i=pos-1 ; i>=1 ; i--) {
			if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
				pos1=i;
				break;
			}
		}
		for(int i=pos+1 ; i<=len ; i++) {
			if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
				pos2=i;
				break;
			}
		}
		int temp;
		int temp1=f(pos1,pos);  // 转化成int类型
		int temp2=f(pos,pos2);  // 转化成int类型
		if(s[pos]=='*') temp=temp1*temp2;
		else  if(s[pos]=='/') temp=temp1/temp2;
		printf("\n= ");
		// 没有用到的原封不动的输出
		for(int i=1 ; i<=pos1 ; i++) {
			if(s[i]==' ')  continue;
			printf(" %c ",s[i]);
		}
		printf(" %d ",temp);
		// 没有用到的原封不动的输出
		for(int i=pos2 ; i<=len ; i++) {
			if(s[i]==' ')  continue;
			printf(" %c ",s[i]);
		}
		//这里我们动了pos1,pos2之间的部分 所以字符串整体要变化
		int zheng[10],cnt=0;
		// 把这个整数的每一位存在数组里
		while(temp>0) {
			zheng[++cnt]=temp%10;
			temp/=10;
		}
		for(int i=pos1+1 ; i<=pos2-1 ; i++) {
			// 把这个整数的每一位转化回字符类型放回字符串中
			if(cnt>0) {
				s[i]='0'+zheng[cnt];
				cnt--;
			} else s[i]=' ';
		}
	}
	// 下面这个找加减的和上面的一摸一样
	while(1) {
		len=strlen(s+1);
		int pos=local2();
		if(pos==-1) break;
		int pos1=0,pos2=len+1;
		for(int i=pos-1 ; i>=1 ; i--) {
			if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
				pos1=i;
				break;
			}
		}
		for(int i=pos+1 ; i<=len ; i++) {
			if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/') {
				pos2=i;
				break;
			}
		}
		int temp;
		int temp1=f(pos1,pos);
		int temp2=f(pos,pos2);
		if(s[pos]=='+') temp=temp1+temp2;
		else if(s[pos]=='-') temp=temp1-temp2;
		printf("\n= ");
		for(int i=1 ; i<=pos1 ; i++) {
			if(s[i]==' ')  continue;
			printf(" %c ",s[i]);
		}

		printf(" %d ",temp);
		for(int i=pos2 ; i<=len ; i++) {
			if(s[i]==' ')  continue;
			printf(" %c ",s[i]);
		}

		int zheng[10],cnt=0;
		while(temp>0) {
			zheng[++cnt]=temp%10;
			temp/=10;
		}
		for(int i=pos1+1 ; i<=pos2-1 ; i++) {
			if(cnt>0) {
				s[i]='0'+zheng[cnt];
				cnt--;
			} else s[i]=' ';
		}

	}
	printf("\n计算完成\n");
}
	return 0;
}




 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服