-1

次のプログラムは、class を使用して、ユーザーが入力した口座番号を取得します。これは、定義済みの形式です。最初の 2 桁はアルファベット、次の 3 桁は支店コード、残りの 10 桁は乱数です。入力された入力がその形式でない場合、ユーザーに再度入力するように求める必要があります。以下のように実装してみました。最初の試行自体で正しい入力を与えると正常に動作しますが、else 部分コードを確認すると、「acno」の値を「tac」に戻す際に問題があります。誰かがコードplsのエラーを修正できますか....ありがとう....

#include<iostream>
#include<string>
using namespace std;

class saving
{
    string acc_no,tac;
    string br_code;
    public:
    void input();
} sav;

string chkno(string acno)
{
    string cc,bc,no,ano;
    int i,len,a=1,b=1,c=1;
    for(len=0; acno[len]!='\0'; len++);
    if(len!=15)
    {
        cout<<"Account No. is Invalid.Please enter again.";
        cout<<"\nAccount No : "; cin>>ano;
        chkno(ano);
    }
    else
    {
        cc=acno.substr(0,2);  bc=acno.substr(2,3);  no=acno.substr(5,10);
        for(i=0; i<2; i++)
        {
            if(!isalpha(cc[i]))
            {
                a=0; break;
            }
        }
        for(i=0; i<3; i++)
        {
            if(!isdigit(bc[i]))
            {
                b=0;  break;
            }
        }
        for(i=0; i<10; i++)
        {
            if(!isdigit(no[i]))
            {
                c=0;   break;
            }
        }
        if(a==1&&b==1&&c==1)
        {
           cout<<"\nValid - Account no : "<<acno;
            return acno;
        }  
        else
        {
            cout<<"Incorrect format.Please enter again";
            cout<<"\nAccount No : "; cin>>ano;
            chkno(ano);
        }
    }
}

void saving::input() 
{
    cout<<"Account No : ";
    cin>>acc_no;
    tac=chkno(acc_no);
    acc_no=tac;
    cout<<"\nAcc.No :"<<acc_no;
    br_code=acc_no.substr(2,3);
    cout<<"\nBranch Code is :"<<br_code;
}sav;

int main()
{
 sav.input(); return 0;
}
4

1 に答える 1

0

これは間違っています

for(len=0; acno[len]!='\0'; len++);

C++ 文字列は C 文字列とは異なり、'\0' ターミネータがありません。C++文字列の長さを知りたい場合は、これを行います

len = acno.size();

また、エラーが発生した場合は chkno を再度呼び出しますが、これは少し奇妙ですが、実際には間違っていません。しかし、間違っているのは、chkno への 2 回目の呼び出しから値を返さないことです。あなたがすべきことはこれです

cout<<"Incorrect format.Please enter again";
cout<<"\nAccount No : "; cin>>ano;
return chkno(ano);

返品を追加した方法をご覧ください。

この演習の最高点を得るには、コードを再設計する必要があると思います。chkno口座番号をチェックするだけの関数にする必要があります(結局、それが呼び出されます)。そのため、口座番号が正しいかどうかに応じて、true または false のブール値を返す必要があります。次に、番号の入力/再入力ループをメインに配置する必要があります。このような

bool chkno(string acno)
{
    ...
}

int main()
{
    cout<<"Account No : ";
    cin>>acc_no;
    while (!chkno(acc_no))
    {
        cout<<"Incorrect format.Please enter again";
        cout<<"\nAccount No : ";
        cin>>acc_no;
    }
    ...
}

これは、この種のタスクを記述する通常の方法です。2 つのタスクが明確に分離されており、ユーザーに数字の入力を促し、その数字が正しいかどうかを確認するため、より優れた設計になっています。

于 2013-03-28T06:43:24.770 に答える