C言語のメモ:算術式の評価の問題

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/weixin_42124234/article/details/101542122

問題のシナリオと実装コード

問題の説明:
すべての中間結果は整数である(二オペレータとの)完全なフリーブラケット減算、乗算、除算4つの整数の算術式の長さは、評価されます。入力ラインフリーブラケット
式長い四則演算のは、「=」の入力の終了を示します。3つの方法の出力:
1、操作は、演算結果出力場合に行うことができる
ゼロ状況による除算は0が出力分割、発生した場合、2
3、オペレータは、数学記号、エラー出力されない場合。

分析:
A、B、Cは、算術演算子の整数、及びOP2のOP1である、複数のオペレータが、ここでオペレータの優先順位場合を考慮する必要があるので、関数int優先(チャーOP)の設計OPは、優先度の整数を表し、オペレータOPのリターン優先順位、前演算子の優先順位とサイズの大きさの優先順位番号を表すが、第二に決定され、オペレータを入力する必要があり、ユーザが正当なもので、INTを機能するように設計されていると判断しISOP(チャーCH)は、演算子の優先順位を決意した後も、ゼロによる除算するかどうかを検討すべきです。(1)優先度がOP1、OP2の優先度よりも大きい場合、最初は、マルチステップ、結果は、OP-Bが割り当てAであり、OP1 OP2割り当て、割り当てB C、OP1 bを算出した後、残留式を計算する;(2 )または最初のB OP2のC、Bに割り当てられた結果を、算出した後、残りの式を計算します。残りの式は、最終的な結果を与えるOP1 bを計算統一します。

/*
问题描述:
完成不含括号的整数的加减乘除四则运算的长算式(含两个运算符)的求值,其中所有的中间结果均为整数。输入一行不含括号
的加减乘除四则运算的长算式,"="表示输入结束。输出有三种情况:
1、如果能够进行运算则输出运算结果
2、如果出现除以零的情况,输出Divided by 0
3、如果运算符不是加减乘除符号,则输出error 
*/
#include <stdio.h>
int Isop(char ch);//判断ch是否为运算符,是返回1,否则返回0 
int Priority(char op);//返回运算符op的优先级,整数大小代表优先级大小 
int Compute(int a,char op,int b);//返回a op b的计算结果 
int main(void)
{
 int a,b,c;//3个操作数 
 char op1,op2;//2个运算符
 printf("请输入格式为:\"a op1 b op2 c =\"(输入'='则是结束)\n"); 
 scanf("%d %c %d %c %d",&a,&op1,&b,&op2,&c);
 getchar();//接收等于号 
 if(!Isop(op1)||!Isop(op2))
 {
  printf("运算符输入错误!");
 }
 else
 {
  if(Priority(op1)>=Priority(op2))//先计算a op1 b,大于等于是因为四则运算在优先级相同的情况下,结合性是从左至右  
  {
   if(op1=='/'&&b==0)
   {
    printf("式子%d %c %d中除数为零!\n",a,op1,b);
    return 0;
   }
   a=Compute(a,op1,b);//a为计算完的a op1 b 
   op1=op2;//op1为op2 
   b=c;//b为c 
  }
  else//先计算b op2 c 
  {
   if(op2=='/'&&c==0)
   {
    printf("式子%d %c %d中除数为零!\n",b,op2,c);
    return 0;
   }
   b=Compute(b,op2,c);
  }
  if(op1=='/'&&b==0)//计算上面两种情况后剩余式子
  {
   printf("除数为零!");
   return 0;
  } 
  a=Compute(a,op1,b);//不管是先计算a op1 b还是b op2 c,剩下最后一步计算在前面两种情况中统一处理a op1 b 
  printf("长算式的结果为:\n");
  printf("%d",a);
  
 } 
 return 0;
}
int Isop(char ch)
{
 int flag;
 switch(ch)
 {
  case '+':
   flag=1;
   break;
  case '-':
   flag=1;
   break;
  case '*':
   flag=1;
   break;
  case '/':
   flag=1;
   break;
  default:
   flag=0;
   break;
 }
 return flag;
}
int Priority(char op)
{
 switch(op)
 {
  case '+'://多个case可共用一个执行语句 
  case '-'://多个case可共用一个执行语句 
   return 1;
  case '*':
  case '/':
   return 2; 
 }
}
int Compute(int a,char op,int b)
{
 switch(op)
 {
  case '+':
   return a+b;
  case '-':
   return a-b;
  case '*':
   return a*b;
  case '/':
   return a/b;
 }
}

結果:
ここに画像を挿入説明

さらに反射および最適化されたコード

考察:
上記のコード番号3は、ユーザが長い方程式、及びプログラム計算結果を入力してみましょうが、ユーザー入力オペランドと演算子の数を制限しないことができる2つの演算子を達成するために計算されましたか?例えば、ユーザ入力3 * 4 + 2 / = 2-1、及びプログラムは、計算結果を出力します。

分析:可変長演算式を考慮すると、式にOP1のB OP2 Cの発現に基づいて実施、(OP1のB連続的に計算のオペランドと演算子は、変換を行うことを条件とする)サイクルを達成するために使用されるべきですスタート0 + B(初期化= 0、OP1 =「+」、入力B)からのキャリアは、Bは、ユーザの第1オペランド入力され、その後、ループを実行する:入力OP2、「=」、式としてOP2場合入力は、演算式が長くなるように、そうでない場合は入力Cを終了し、その後、OP-BはOP2 cおよびOP2上記計算コードなる各文字を受信し、オペランドが演算子の優先順位に応じて、Cを受信して​​いますレベルは、第一の算出かOP1とOP2、計算結果は、OP-1、式Bのために保証されていない「=」までOP2、式の終わり。

/*
问题描述:
完成不含括号的整数的加减乘除四则运算的长算式(含两个运算符)的求值,其中所有的中间结果均为整数。输入一行不含括号
的加减乘除四则运算的长算式,"="表示输入结束。输出有三种情况:
1、如果能够进行运算则输出运算结果
2、如果出现除以零的情况,输出Divided by 0
3、如果运算符不是加减乘除符号,则输出error 
*/
#include <stdio.h>
int Isop(char ch);//判断ch是否为运算符,是返回1,否则返回0 
int Priority(char op);//返回运算符op的优先级,整数大小代表优先级大小 
int Compute(int a,char op,int b);//返回a op b的计算结果 
int main(void)
{
 int a,b,c;//3个操作数 
 char op1,op2;//2个运算符
 printf("输入表达式=结束\n");
 a=0;
 op1='+';
 scanf("%d",&b);
 while(1)
 {
  op2=getchar();
  if(op2=='=')
  {
   break;
  }
  else
  {
   scanf("%d",&c);
  }
  if(!Isop(op2))
  {
   printf("运算符输入错误!");
   return 0;
  }
  if(Priority(op1)>=Priority(op2))//先计算a op1 b ,大于等于是因为四则运算在优先级相同的情况下,结合性是从左至右 
  {
   if(op1=='/'&&b==0)
   {
    printf("式子%d %c %d中除数为零!\n",a,op1,b);
    return 0;
   }
   a=Compute(a,op1,b);//a为计算完的a op1 b 
   op1=op2;//op1为op2 
   b=c;//b为c 
  }
  else//先计算b op2 c 
  {
   if(op2=='/'&&c==0)
   {
    printf("式子%d %c %d中除数为零!\n",b,op2,c);
    return 0;
   }
   b=Compute(b,op2,c);
  }
 }
 if(op1=='/'&&b==0)//计算上面两种情况后剩余式子
 {
  printf("除数为零!");
  return 0;
 } 
 a=Compute(a,op1,b);//不管是先计算a op1 b还是b op2 c,剩下最后一步计算在前面两种情况中统一处理a op1 b 
 printf("长算式的结果为:\n");
 printf("%d",a);
 return 0;
}
int Isop(char ch)
{
 int flag;
 switch(ch)
 {
  case '+':
   flag=1;
   break;
  case '-':
   flag=1;
   break;
  case '*':
   flag=1;
   break;
  case '/':
   flag=1;
   break;
  default:
   flag=0;
   break;
 }
 return flag;
}
int Priority(char op)
{
 switch(op)
 {
  case '+'://多个case可共用一个执行语句 
  case '-'://多个case可共用一个执行语句 
   return 1;
  case '*':
  case '/':
   return 2; 
 }
}
int Compute(int a,char op,int b)
{
 switch(op)
 {
  case '+':
   return a+b;
  case '-':
   return a-b;
  case '*':
   return a*b;
  case '/':
   return a/b;
 }
}

実行結果:
ここに画像を挿入説明
説明:
算術式:* 3 2 + 4 / 2-1、処理は毎回計算されます。

  • 0 + 2 + 3
  • 2 + 3 * 4
  • 2 + 12月2日
  • 2 + 6-1

要するに、リターンOP1のB OP2 Cの計算を形成します。

参考図書「戦闘を投影するエントリからC言語」王Yiping、編

おすすめ

転載: blog.csdn.net/weixin_42124234/article/details/101542122