#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
*/
C語言實現簡易計算器,能夠顯示每一步的計算過程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.