実数混合演算をC言語で実現(括弧付き、スタック不要)
1505 ワード
以前はネットで似たような文章をたくさん探しましたが、機能が足りないものもあれば、マルチレベルのカッコを実現できないものもあれば、スタックを使ったものもあり、コードは初心者には理解しにくいです.だから自分で一つ書きました.しかし、完全なコードではありませんが、この論理をよく説明することができます.
わかりにくい点を簡単に説明します.
まず、マルチレベルカッコを実装する場合は必ず再帰を使用しますが、入力した文字列を解析するには1回しかかからないので、入力した式をdivideとsymbleで解析し、解析した浮動小数点型配列と文字配列を解析関数に渡します.
増減、乗除、括弧に遭遇した場合の処理方法:
加算減算と乗算除算の優先度が異なるため、処理時には乗算除算を処理してから加算減算を計算する必要があり、プログラム内のグローバル配列は第1の処理(処理乗算除算)に用いられ、関数内部の配列は第2の処理(加算減算処理)に用いられる.
#include
#include
char * symble(char *a);
float mix(float *x,char *a);
int divide(float *p,char *c);
float index[30];
float *p;
char *c;
char sym[50];
int e=0;
int main()
{
printf("
");
scanf("%s",c);
e=divide(p,c);
printf("%5.2f
",mix(p,symble(c)));
}
int divide(float *p,char *c)
{
int i,j=0,m=0;
int t = 0;
float number=0;
for(i=0;*(c+i)!='\0';i++){
if(*(c+i)>='0'&&*(c+i)<='9'){
number=number*10+(*(c+i)-'0');
}
if(*(c+i)=='.')
{
m=0;
i++;
while(*(c+i)>='0'&&*(c+i)<='9')
{
number=number*10+(*(c+i)-'0');
m++;
i++;
}
for(int a=0;a
わかりにくい点を簡単に説明します.
まず、マルチレベルカッコを実装する場合は必ず再帰を使用しますが、入力した文字列を解析するには1回しかかからないので、入力した式をdivideとsymbleで解析し、解析した浮動小数点型配列と文字配列を解析関数に渡します.
増減、乗除、括弧に遭遇した場合の処理方法:
加算減算と乗算除算の優先度が異なるため、処理時には乗算除算を処理してから加算減算を計算する必要があり、プログラム内のグローバル配列は第1の処理(処理乗算除算)に用いられ、関数内部の配列は第2の処理(加算減算処理)に用いられる.