Cinは

2016-09-22 3 views
0

無効な入力を取って、私は単にアッカーマン関数を計算するプログラムを持っている:コードのCinは

#include <iostream> 

// Ackermann function calculations 
unsigned int ackermann(unsigned int m, unsigned int n){ 
    if(m == 0) 
     return n+1; 
    if(n == 0) 
     return ackermann(m-1,1); 
    return ackermann(m-1,ackermann(m,n-1)); 
} 

// Check for non-integer input 
bool inputCheck(){ 
    if(!std::cin.fail()) 
     return false; 

    std::cout << "Invalid input!" << std::endl; 
    return true; 
} 

// Check for negative or overflow errors 
bool numCheck(int i, char name){ 
    if(i < 0){ 
     std::cout << "Negative error!" << std::endl; 
     return true; 
    } 

    if(name == 'm' && i > 3){ 
     std::cout << "Overflow error (m > 3)!" << std::endl; 
     return true; 
    } 

    if(name == 'n' && i > 12){ 
     std::cout << "Overflow error (n > 12)!" << std::endl; 
     return true; 
    } 

    return false; 
} 

// Run input and num checks 
bool check(int x, char y){ 
    bool result = inputCheck() || numCheck(x, y); 

    std::cin.clear(); 
    std::cin.ignore(); 

    return result; 
} 

int main(){ 

    int m, n; 
    bool valM, valN; 

    do{ 
     std::cout << "m = "; 
     std::cin >> m; 
     valM = check(m, 'm'); 
    } while(valM); 

    do{ 
     std::cout << "n = "; 
     std::cin >> n; 
     valN = check(n, 'n'); 
    } while(valN); 

    std::cout << "\nM = " << m << "\nN = " << n 
      << "\n\nCALCULATING..." << std::endl; 

    std::cout << "A(" << m << ',' << n << ") = " << ackermann(m,n) << std::endl; 

    return 0; 
} 

大半が不正な入力のためにチェックしています。計算上の理由から、mは3より大きくすることはできず、nは12より大きくすることはできません。また、入力が負であるかどうかを確認します。ユーザーが3zのようなものを入力すると

  • :問題を既知の

    。 cinは3をとり、zを無視します。明らかに、3z3と異なり、このような無効な入力を検出したいと思います。

  • ユーザが1.2のようなものを入力した場合。 cinはmに1を、nに2をとります。プログラムは、期間を無視して2つの入力として受け取り、そのような無効な入力を検出したいと思います。

正しい入力のみになるようにコードを修正または修正する方法を教えてください。

+0

'' 3z''で何が起こっているのか説明できますか? '' z''はどういう意味ですか? – nathanesau

+0

@nathanesauプログラムは整数入力のみを受け入れる必要があります。 '3z'(または類似)が入力されると、zが無視され、zが存在しないように' 3'をとります。ある意味では、私はそのような無効な入力( '3z'のような)を検出したい。 – esote

答えて

0

入力が1.2のようなものかどうかを確認しました。

mnを整数で初期化する代わりに、2倍に初期化することができます。丸みを帯びた二重の初期重と同じであれば、私がチェックすることができます。

double x; 

if(floor(x) != x){ 
    // not an integer 
} 

1.2のようなものが整数であるかどうか、私は確認することができ、これを使用します。次に、doubleを整数に変換してプログラムで続けることができます。

でも、3zなどの無効な入力を確認することはできません。

0

この投稿は、あなたが求めているものに関連している可能性がある:

Checking input value is an integer

それはint型へのCINから新鮮に読み込まれた値が有効なint型だったかどうかを確認する方法を示しています。

0

文字列を読み込んで文字列をintに変換することをお勧めします。このようなものはうまくいくでしょう。

#include <iostream> 
#include <cctype> 
#include <string> 

// true is s is an int, false otherwise 

bool is_number(const std::string& s) 
{ 
    std::string::const_iterator it = s.begin(); 
    while (it != s.end() && std::isdigit(*it)) ++it; 
    return !s.empty() && it == s.end(); 
} 

// Ackermann function calculations 
unsigned int ackermann(unsigned int m, unsigned int n) { 
    if (m == 0) 
     return n + 1; 
    if (n == 0) 
     return ackermann(m - 1, 1); 
    return ackermann(m - 1, ackermann(m, n - 1)); 
} 

// Check for non-integer input 
bool inputCheck() { 
    if (!std::cin.fail()) 
     return false; 

    std::cout << "Invalid input!" << std::endl; 
    return true; 
} 

// Check for negative or overflow errors 
bool numCheck(int i, char name) { 
    if (i < 0) { 
     std::cout << "Negative error!" << std::endl; 
     return true; 
    } 

    if (name == 'm' && i > 3) { 
     std::cout << "Overflow error (m > 3)!" << std::endl; 
     return true; 
    } 

    if (name == 'n' && i > 12) { 
     std::cout << "Overflow error (n > 12)!" << std::endl; 
     return true; 
    } 

    return false; 
} 

// Run input and num checks 
bool check(int x, char y) { 
    bool result = inputCheck() || numCheck(x, y); 

    std::cin.clear(); 
    std::cin.ignore(); 

    return result; 
} 

int main() { 

    std::string mstr, nstr; // parse int from string 
    int m, n; 
    bool valM, valN; 

    std::cout << "m = "; 
    std::getline(std::cin, mstr); 

    if (is_number(mstr)) 
    { 
     m = atoi(mstr.c_str()); // now we have m as an int 
    } 

    valM = check(m, 'm'); 

    std::cout << "n = "; 
    std::getline(std::cin, nstr); 

    if (is_number(nstr)) 
    { 
     n = atoi(nstr.c_str()); // now we have n as an int 
    } 

    valN = check(n, 'n'); 

    std::cout << "\nM = " << m << "\nN = " << n 
     << "\n\nCALCULATING..." << std::endl; 

    std::cout << "A(" << m << ',' << n << ") = " << ackermann(m, n) << std::endl; 

    return 0; 
}