1

多くのユーザー入力を必要とするコードがあります。ユーザーが正しい入力タイプを入力したことを確認し、入力されていない場合は、正しい入力を入力するように促します。

今では、if考えられるすべての入力をカバーするかなりの量のステートメントでこれを行うことができますが、より良い、より効率的な方法があるはずです。私はいくつかの可能な代替ソリューション(例えばtypeidthrow/catch)を見てきましたが、それらはそれが優れたプログラミング技術であるかどうかで人々を分けているようです。

では、この問題を回避するための最良の方法は何ですか?

入ってくる入力から私が知っている/必要なことを概説しました:

  • ユーザーが入力する必要のあるタイプを知っています(、、またはのいずれかintsですdoublesstrings
  • 正しい入力が入力されていることを確認する必要があります。入力されていない場合は、タイプの入力を入力するように求められますX
  • このチェック/読み取りを実行する必要がある場合が多いため、コードは関数(またはテンプレートなど)に格納する必要があり、3つのケースすべてに適用できます。

getline(cin,X)一部の入力にスペースが含まれているため、使用していることにも注意してください。これが私が参照しているコードです:

        while(again==1){
            cout<<"Please enter student name: "<<endl;
            sName=clear_and_read<string>();
            cout<<"Please enter student ID: "<<endl;
            sID=clear_and_read<int>();
            cout<<"What course does the student study? (1)Physics etc...."<<endl;
            sCourse=clear_and_read<int>();
            cout<<"How many results would you like to enter for this student?: "<<endl;
            d=clear_and_read<int>();
            student* S1= new physics(sName,sID);  //*********
            //physics S1(sName,sID);
            if(sCourse==1){
                for(int i(0);i<d;i++){
                    string cName("Nill"); double cResult(0);int cCode(0);
                    cout<<"Please enter course "<<i+1<<" code: "<<endl;
                    cCode=clear_and_read<int>();
                    cout<<"Please enter course "<<i+1<<" title: "<<endl;
                    cName=clear_and_read<string>();;
                    cout<<"Please enter result "<<i+1<<": "<<endl;
                    cResult=clear_and_read<double>();;
                    (*S1).addresult(cName,cCode,cResult);
                }           
            }
            //allstudents.insert(pair<int,student*>(sID,S1)); //********* 
            allstudents[sID]=S1;    //THIS LINE
            cout<<"Would you like to enter another student manually? (1)Yes (2)No :"<<endl;
            again=clear_and_read<int>();;
        }

現在、受信データがテンプレートに入力されたものと同じであることを確認する未完成のテンプレート関数を作成しましたが、これを行う方法に固執していました。clear_and_read

template <class T> T clear_and_read(){ //NOT CORRECT YET
    string name;
    cin.ignore();//skips "enter" still in cin stream
    cin.clear();
    getline(cin,name);
    T typeoutput;



    //needs to check for valid type
        //assign name to typeoutput
    return typeoutput;
}

このテンプレートクラスを挿入する前は、コードsName=clear_and_read<string>();getline(cin,sName);などでした。

ちなみに、「かなりの量のifステートメント」とは、必要な入力ごとにif-check/elseステートメントが必要になるということです。

私は物事を複雑にしすぎていますか?

これが明確であることを願っています。

4

0 に答える 0