杭電OJ——簡単計算機


たんじゅんけいさんき
Problem Description
+、-、*、/のみを含む非負の整数計算式を読み込み、その値を計算します.
Input
テスト入力には、各テスト・インスタンスが1行を占め、各行が200文字を超えず、整数と演算子の間にスペースで区切られたいくつかのテスト・インスタンスが含まれます.不正な式はありません.1行に0しかない場合は入力が終了し、対応する結果は出力されません.
Output
各テストケースに1行、すなわち式の値を小数点以下2桁まで出力します.
Sample Input

   
   
   
   
1 + 2 4 + 2 * 5 - 7 / 11 0

Sample Output

   
   
   
   
3.00 13.36

問題は難しくない!ただあまりにも奇妙すぎる!長い間REだったので、配列やポインタの境界を越えるようにヒントを与えました!結局私は間違いを探して長い間探していました!すみません.ずっと間違いが見つからなかった!杭電のテストデータがどうなっているのか分からない.お父さん!ヒント越境!どこへ行って間違いを正すんだ?最後に!この話を書くときも、我慢できません!もう間違いを正したくない!私のコードに間違いがないことしか知らない!ACのために、他の人のコードを参考にしました!思想は自分のしたことと基本的に一致します!この問題も人柄次第ですか.しつこい!神様が原因を知っていたら!指を指さしてください.もう我慢できない!
ちょっとした知識点をまとめましょう!
1.scanfで入力すると、スペースに出会って終わり、getsでスペースを入力できます!だからこの問題にはgets関数で入力します!
//             ‘+’ ‘-’ ‘*’ ‘/’  !
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stack>

using namespace std;
//        !   !
int cmp[4][4]={
	1,1,0,0,
	1,1,0,0,
	1,1,1,1,
	1,1,1,1};

bool Isnum(char ch)
{
	if(ch >= '0' && ch <= '9') return true;
	else return false;
}

double Caculate(double a,char b,double c)
{
	switch(b)
    {
		case '+':return a+c;
		case '-':return a-c;
		case '*':return a*c;
		case '/':return a/c;
	}
	return 0;
}

inline int Compare(char &a,char &b)
{
	int m,n;
	switch(a)
   {    
	    case '+':m=0;break;
		case '-':m=1;break;
		case '*':m=2;break;
		case '/':m=3;break;
	}
	switch(b)
    {    
	    case '+':n=0;break;
		case '-':n=1;break;
		case '*':n=2;break;
		case '/':n=3;break;
	}
	return cmp[m][n];
}

int main()
{
	char str[300];
	double a,b;
	char theta;
	int i,flag;
	double s;
	

    while(gets(str))
	{
		if(strcmp("0",str)==0) break;
		stack<char> s1;
	    stack<double> s2;
		
        /*
		for(i=0;i<strlen(str);)
		  { 
		   switch(str[i])
		   {
		   case '0':
		   case '1':
		   case '2':
		   case '3':
		   case '4':
		   case '5':
		   case '6':
		   case '7':
		   case '8':
		   case '9':
			     s=str[i]-'0'; i++;
				 while(str[i]!=' '&& str[i]!='\0')
				 {
				   s=s*10+(str[i]-'0');
				   i++;
				 }
			     s2.push(s);
			     i++;  break;
		   //cout<<sum<<endl;
			  
		   case '+':
		   case '-':
			   if(s1.empty())
				 s1.push(str[i]);
			   else
			   {
					while(!s1.empty())
					{
					 theta=s1.top();s1.pop();
					 b=s2.top();s2.pop();
					 a=s2.top();s2.pop();
					 s2.push(Caculate(a,theta,b));
					}
					s1.push(str[i]);
			   }
			   i+=2; break;
			  
		  case '/':
		  case '*':
				 if(s1.empty())
			     s1.push(str[i]);
				 else
				 {
					  if(s1.top()=='*'||s1.top()=='/')
					  {
						  theta=s1.top();s1.pop();
						  b=s2.top();s2.pop();
						  a=s2.top();s2.pop();
						  s2.push(Caculate(a,theta,b));
					  }
					  s1.push(str[i]);
				 }
				 i+=2; break;
				 
		   }
		  }*/
		
		 /*
		 for(i=0;i<strlen(str);)
		 {
			if(str[i]==' ') i++;//        ,    
		
			else   if(Isnum(str[i]))//        !
					{
					   s=str[i]-'0'; i++;
					   while(str[i]!=' '&& str[i]!='\0')//      !
					   {
						 s=s*10+(str[i]-'0');
						 i++;
					   }
					   s2.push(s);
					}
					else//      !
					if(s1.empty()) {s1.push(str[i]);i++;}
					else//    
					{   
						flag=1;
						while(flag)//          ,    ch      !
						{
							if(Compare(str[i],s1.top())==1)
							{
							   s1.push(str[i]); flag=0;//    ,   
							}
							else
							{
								theta=s1.top(); s1.pop();//    
								b=s2.top(); s2.pop();
								a=s2.top(); s2.pop();
								s2.push(Caculate(a,theta,b));//             !
							}
						}
						i++;
					}
		}//for  !
		*/
          for(i=0;i<strlen(str);)//            ,    !
		  { 
		       if(str[i]==' ') i++;
			   else
		       if(Isnum(str[i]))
			   {
					 s=str[i]-'0'; i++;
					 while(str[i]!=' '&&str[i]!='\0')
					 {
					   s=s*10+(str[i]-'0');
					   i++;
					 }
					 s2.push(s);
					 i++; 
			   }
			  else
			  {
				 switch(str[i])
				 {
				   case '+':
				   case '-':
					   if(s1.empty())
						 s1.push(str[i]);
					   else
					   {
							while(!s1.empty())
							{
							 theta=s1.top();s1.pop();
							 b=s2.top();s2.pop();
							 a=s2.top();s2.pop();
							 s2.push(Caculate(a,theta,b));
							}
							s1.push(str[i]);
					   }
					   i+=2; break;
					  
				  case '/':
				  case '*':
						 if(s1.empty())
						 s1.push(str[i]);
						 else
						 {
							  if(s1.top()=='*'||s1.top()=='/')
							  {
								  theta=s1.top();s1.pop();
								  b=s2.top();s2.pop();
								  a=s2.top();s2.pop();
								  s2.push(Caculate(a,theta,b));
							  }
							  s1.push(str[i]);
						 }
						 i+=2; break;
				 }//switch
			}//else
				 
	 }//for


       /*for(i=0;i<strlen(str);)//            ,    !
		  { 
		       if(str[i]==' ') i++;
			   else
		       if(Isnum(str[i]))
			   {
					 s=str[i]-'0'; i++;
					 while(str[i]!=' '&& str[i]!='\0')
					 {
					   s=s*10+(str[i]-'0');
					   i++;
					 }
					 s2.push(s);
					 //i--; 
			   }
			  else
			  {
				 if(s1.empty()) {s1.push(str[i]);i++;}
					else//    
					{   
						flag=1;
						while(flag)//          ,    ch      !
						{
                            
							if(Compare(str[i],s1.top())==1)
							{
							   s1.push(str[i]); flag=0;//    ,   
							}
							else
							if(!s1.empty())
							{
								theta=s1.top(); s1.pop();//    
								b=s2.top(); s2.pop();
								a=s2.top(); s2.pop();
								s2.push(Caculate(a,theta,b));//             !
								
							}
							else//  s1  
							{ s1.push(str[i]); flag=0;}//        !  s1    !  s1       
				            //    !        !  , str[i]  ,      !
						}
						i++;
					}
				 }//switch
			}//else
			*/
			while(!s1.empty())//   ,        ,      !
			{
				theta=s1.top(); s1.pop();
				b=s2.top(); s2.pop();
				a=s2.top(); s2.pop();
				s2.push(Caculate(a,theta,b));
			}
			s=s2.top();
			s2.pop();
			printf("%.2lf
",s);// , ! } return 0; }

文章を転載しましょう.http://blog.csdn.net/dtqzlgj/article/details/6959281
最も全入力関数c/c++1:c=getchar()機能:文字の説明を読み込みます:この関数を呼び出す時プログラムの第1行にプリコンパイルコマンドがあることを要求します:#includeがあって、しかしc++をする時
#includeがあっても十分です.変数cは、標準デバイスから読み出された文字コード値を取得する.スレーブキー
ディスクに^z(つまりCTRLとZキーを同時に押す)を入力すると、Cで得られる値は-1であり、^zはファイルの末尾と呼ばれ、プログラム中に
符号定数EOFで表されることが多い.二:文字列入力関数char*s;gets(s); 機能:文字列を読み出し、sが指すメモリに格納します.に遭遇すると文字列の入力が終了し、
文字を"0"(すなわちNULL)に自動的に変換して列の末尾に配置し、文字列を構成します.説明:Sは、取得した文字列の先頭アドレスを指す文字列ポインタです.正常に戻ると、文字列に戻ります.
で行ないます.ファイルの最終品目エラーが発生した場合はNULLに戻ります.NULLの定義形式は「#DEFINE NULL 0」であるstdioに含まれる.hのヘッダファイルにあります.さらにc++で使用するとヘッダファイルincludeがcinに類似する.getline()の一例では、gets()も多次元配列で使用できます:#include#includeusing namespace std;main(){char m[3][20];for(int i=0;i<3;i+){cout<<<第を入力してください<>にも適用可能である.
ああ、ここにスペースが入力されていないので、スペースが入力されている場合、例えば「ks kr jkl[リターン]」が入力されている場合、cinはすでに
3つの文字列、「ks,kr,jkl」が受信された.更に「kskr 1[リターン]kskr 2[リターン]」のように、
「kskr,1,kskr」を受け取る.これは私たちが望んでいる結果ではありません!そしてcin.getline()とgets()はスペースを受信できるので、
だからこの間違いは起こらない.三.cin.get()用法1:cin.get(文字変数名)は、文字#includeusing namespace stdを受信するために使用することができる.int main(){char ch;ch=cin.get();//またはcin.get(ch);cout<using namespace stdを受信することができる.main () { char a[20]; cin.get(a,20); cout<using namespace stdを出力できる文字列を受け入れます.main () { char m[20]; cin.getline(m,5); cout<3番目のパラメータが省略する場合、システムのデフォルトは'0'//例のcin.getline()をcinに変更する.getline(m,5,'a');jlkjkljklが入力されるとjkljが出力され、入力
jkaljkljklの場合、出力jkは多次元配列に用いる場合にcinを用いてもよい.getline(m[i],20)などの使い方:#include#includeusing namespace std;main(){char m[3][20];for(int i=0;i<3;i+){cout<<<第を入力してください<」#include#includeusing namespace std;main () { string str; getline(cin,str); cout<同じ2つの関数