後で理解を容易にするために、このコードは、上記以外のライブラリやマクロ定義を構成するためにここにあります:
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
#define f(a,b,c,d) for(register int a=b,c=d;a<=c;a++)
#define g(a,b,c,d) for(register int a=b,c=d;a>=c;a--)
typedef int i32;
typedef unsigned int u32;
typedef long long int i64;
typedef unsigned long long int u64;
初め
クロック(CLOCK)とワールド(WORLD):唯一の2つのオブジェクトを考えてみましょう
クロックプロパティは:時間(時間)、点(ミント)、第二(SECD)
クロック方式を含む:(ADD)増加、リセット(セット)、ビュー(表示)、クリア(リセット)され、アップデート(更新)
あって世界のプロパティ:(注文)時計(x)は、命令の
世界を含む方法:エラーがスローされます(error_solve)、コマンド認識(take_in)
分析
それぞれ、世界で今、クロックを達成するために:
クロック
最初の2つの方法、文字列 - デジタルを必要とクロックオブジェクト、文字列にデジタル用
我々は二つの新しい方法を構築:デジタル(to_Num)とターン文字列(to_s)
方法は、好ましくは、デジタルに実装され、入力文字列が文字列クラスに格納され、単一の数を計算するために同様の最適な方法を読み取ります。ただ覚えているプラスレイド文:負の始まりが複数発生する可能性はなく、中間、およびその他の決意がデジタル特殊判決に変換することができない、シンプルな実装が可能。
inline bool to_Num(string s,i32 &d_Num){
d_Num=0;
bool b_Neg=0,b_Start=0;
f(i,0,I,s.size()-1){
if(s[i]=='-'&&b_Start==0) b_Neg^=1;
else if(s[i]>='0'&&s[i]<='9'){
d_Num=d_Num*10+s[i]-48;
b_Start=1;
}
else return 0;
}
if(b_Neg) d_Num=-d_Num;
return 1;
}
それは、書き込みには比較的容易であるので、アカウントに特定の文字列の回転を取る方法は、2桁の文字列に変換されます。
inline string to_s(i32 d_Num){
string s="";
if(d_Num/10) s+=d_Num/10+'0';
s+=d_Num%10+'0';
return s;
}
そして、上記の5つの方法を達成するために一つずつ:
増加させる方法
入力された文字列は、クロックの特性を考慮して、直接秒に移し、元の時間に加えデジタル、秒数の必要性は、分、時間が連続処理を運ぶに変換されます。考慮し、ユーザーが「分、秒」または「時:分:秒」と入力し、フォーマットを次に増加を秒数(to_Sec)メソッドを回し、秒数が同じ処理を残りのクラスに変換されます。私は通常、特別な裁判官外のすべての特別の事情が増加することができなかった覚えています。
inline void add(i64 d_Time){
d_Secd+=d_Time%60;
if(d_Secd>=60) d_Secd-=60,d_Mint++;
d_Time/=60;
d_Mint+=d_Time%60;
if(d_Mint>=60) d_Mint-=60,d_Hour++;
d_Time/=60;
d_Hour+=d_Time;
if(d_Hour>=24) d_Hour-=24;
}
inline bool add(string s){
i32 d_Time;
if(s.find(" ")!=string::npos) { if( !to_Sec(s,d_Time) ) return 0; }
else { if( !to_Num(s,d_Time) ) return 0; }
d_Time%=86400;
if(d_Time<0) d_Time+=86400;
add(d_Time);
return 1;
}
順次設定、分、秒の3桁かどうかを判断する際の方法は、好ましくは、秒の回転数を達成するために、戻り送り速度に秒数であることができます。
inline bool to_Sec(string ss,i32 &d_Time){
f(i,0,I,ss.size()-1) if(ss[i]==':') ss[i]=' ';
i32 h,m,s;
string tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,h) ) return 0;
ss=tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,m) ) return 0;
ss=tmp;
if(ss.find(" ")!=string::npos) return 0;
if( !to_Num(ss,s) ) return 0;
d_Time+=3600*h+60*m+s;
return 1;
}
メソッドをリセット
「分・秒」または「時間:分:秒」読み込み時間の形では、非準拠の任意の時間、分、秒、あなたは間違って判断することができます。もちろん、転送は、与党直接表示することができません。
inline void set(i32 h,i32 m,i32 s) { *this=CLOCK(h,m,s); }
inline bool set(string ss){
f(i,0,I,ss.size()-1) if(ss[i]==':') ss[i]=' ';
i32 h,m,s;
string tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,h) ) return 0;
ss=tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,m) ) return 0;
ss=tmp;
if(ss.find(" ")!=string::npos) return 0;
if( !to_Num(ss,s) ) return 0;
if(h<0||h>=24||m<0||m>=60||s<0||s>=60) return 0;
set(h,m,s);
return 1;
}
チェック方法
帰国上記文字列の直接コール転送方法、「時:分:秒」の形式の文字列の手段
inline string show(){ return to_s(d_Hour)+":"+to_s(d_Mint)+":"+to_s(d_Secd); }
Clearメソッド
同等のリセット "0:0:0"
inline void reset() { set(0,0,0); }
アップデート方法
1秒の増加を示します
inline void update() { add(1); }
世界
この方法は、エラーがスローされます
への直接出力
inline void error_solve() { cout<<"Input error!"<<endl; }
命令の実行方法
まず空白かどうかを判断します
スローに対応するメソッドが成功したかどうかを決定するためのこれらの2つの方法、失敗したニーズ;スペースがある場合は、唯一、リセット方法を増やす、または入力フォーマットが間違っていることができます
スペースがない場合は、唯一の直接実行することができ、更新方法は、彼らが成功したかどうかを判断する必要はありません、表示、消去することができます
inline void take_in(string order){
if(order.find(" ")!=string::npos){
tmp=order.substr( order.find(" ")+1 );
order=order.substr(0, order.find(" ") );
if(order=="add") { if( !x.add(tmp) ) error_solve(); }
else if(order=="set") { if( !x.set(tmp) ) error_solve();}
else error_solve();
}
else{
if(order=="show") cout<<x.show()<<endl;
else if(order=="reset") x.reset();
else if(order=="update") x.update();
else error_solve();
}
}
実現
#include<cstdio>
#include<iostream>
#include<string>
#include<map>
using namespace std;
#define f(a,b,c,d) for(register int a=b,c=d;a<=c;a++)
#define g(a,b,c,d) for(register int a=b,c=d;a>=c;a--)
typedef int i32;
typedef unsigned int u32;
typedef long long int i64;
typedef unsigned long long int u64;
class CLOCK{
private:
inline bool to_Num(string s,i32 &d_Num){
d_Num=0;
bool b_Neg=0,b_Start=0;
f(i,0,I,s.size()-1){
if(s[i]=='-'&&b_Start==0) b_Neg^=1;
else if(s[i]>='0'&&s[i]<='9'){
d_Num=d_Num*10+s[i]-48;
b_Start=1;
}
else return 0;
}
if(b_Neg) d_Num=-d_Num;
return 1;
}
inline string to_s(i32 d_Num){
string s="";
if(d_Num/10) s+=d_Num/10+'0';
s+=d_Num%10+'0';
return s;
}
int d_Hour,d_Mint,d_Secd;
inline void add(i64 d_Time){
d_Secd+=d_Time%60;
if(d_Secd>=60) d_Secd-=60,d_Mint++;
d_Time/=60;
d_Mint+=d_Time%60;
if(d_Mint>=60) d_Mint-=60,d_Hour++;
d_Time/=60;
d_Hour+=d_Time;
if(d_Hour>=24) d_Hour-=24;
}
inline void set(i32 h,i32 m,i32 s) { *this=CLOCK(h,m,s); }
inline bool to_Sec(string ss,i32 &d_Time){
f(i,0,I,ss.size()-1) if(ss[i]==':') ss[i]=' ';
i32 h,m,s;
string tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,h) ) return 0;
ss=tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,m) ) return 0;
ss=tmp;
if(ss.find(" ")!=string::npos) return 0;
if( !to_Num(ss,s) ) return 0;
d_Time+=3600*h+60*m+s;
return 1;
}
public:
CLOCK(i32 d_Hour_=0,i32 d_Mint_=0,i32 d_Secd_=0):d_Hour(d_Hour_),d_Mint(d_Mint_),d_Secd(d_Secd_) {}
~CLOCK() {}
inline bool add(string s){
i32 d_Time;
if(s.find(" ")!=string::npos) { if( !to_Sec(s,d_Time) ) return 0; }
else { if( !to_Num(s,d_Time) ) return 0; }
d_Time%=86400;
if(d_Time<0) d_Time+=86400;
add(d_Time);
return 1;
}
inline bool set(string ss){
f(i,0,I,ss.size()-1) if(ss[i]==':') ss[i]=' ';
i32 h,m,s;
string tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,h) ) return 0;
ss=tmp;
if(ss.find(" ")==string::npos) return 0;
tmp=ss.substr( ss.find(" ")+1 );
ss=ss.substr(0, ss.find(" ") );
if( !to_Num(ss,m) ) return 0;
ss=tmp;
if(ss.find(" ")!=string::npos) return 0;
if( !to_Num(ss,s) ) return 0;
if(h<0||h>=24||m<0||m>=60||s<0||s>=60) return 0;
set(h,m,s);
return 1;
}
inline string show(){ return to_s(d_Hour)+":"+to_s(d_Mint)+":"+to_s(d_Secd); }
inline void reset() { set(0,0,0); }
inline void update() { add(1); }
};
class WORLD{
private:
CLOCK x;
string tmp;
inline void error_solve() { cout<<"Input error!"<<endl; }
public:
WORLD() {}
~WORLD() {}
inline void take_in(string order){
if(order.find(" ")!=string::npos){
tmp=order.substr( order.find(" ")+1 );
order=order.substr(0, order.find(" ") );
if(order=="add") { if( !x.add(tmp) ) error_solve(); }
else if(order=="set") { if( !x.set(tmp) ) error_solve();}
else error_solve();
}
else{
if(order=="show") cout<<x.show()<<endl;
else if(order=="reset") x.reset();
else if(order=="update") x.update();
else error_solve();
}
}
}w;
int main(){
string order;
while( getline(cin,order) ) w.take_in(order);
return 0;
}