PKU 1537 Identifying Legal Pascal Real Constants
http://poj.org/problem?id=1537
小数の表示形式が正しいかどうかを判定する。
({+|-}+1つ以上の連続する数字列)+{'.'+(1つ以上の連続する数字列)}+{('E'|'e')+(1つ以上の連続する数字列)}
みたいに遷移する関数を書いて、それにあてはまらないものが出たらillegalにしました。
途中WAがでまくりましたが、入出力最後の判定の前に入力を出力するというミスを犯していたので、どこらへんまでやる必要があったのかはよくわかりません。
string in; int pos; bool ok; void expo(){ if(pos==in.size()){ ok=false; return; } if(in[pos]=='+' || in[pos]=='-')++pos; if(pos==in.size()){ ok=false; return; } while(pos<in.size() && isdigit(in[pos]))++pos; if(pos==in.size())return; ok=false; } void decimal(){ if(pos==in.size()){ ok=false; return; } if(!isdigit(in[pos])){ ok=false; return; } while(pos<in.size() && isdigit(in[pos]))++pos; if(pos==in.size())return; if(in[pos]=='e' || in[pos]=='E'){ ++pos; expo(); }else ok=false; } void check(){ if(in[pos]=='-' || in[pos]=='+')++pos; if(!isdigit(in[pos])){ ok=false; return; } while(pos<in.size() && isdigit(in[pos]))++pos; if(pos==in.size()){ ok=false; return; } if(in[pos]!='.' && in[pos]!='e' && in[pos]!='E'){ ok=false; return; } if(in[pos]=='.'){ ++pos; decimal(); }else{ ++pos; expo(); } } main(){ while(getline(cin,in)){ if(in=="*")break; while(in.size() && in[0]==' ')in=in.substr(1); cout<<in<<" is "; pos=0; ok=true; check(); if(ok)cout<<"legal."<<endl; else cout<<"illegal."<<endl; } }