C language implements a simple calculator that can display the calculation process of each step

#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;
}

/*
1+2*2+1+2*2+1
*/


Guess you like

Origin blog.csdn.net/wmy0536/article/details/106405434