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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章