如何为C++线性不定方程求解程序添加合法整数值输入校验?
为线性不定方程求解代码添加输入校验功能
现有一段求解线性不定方程的C++代码,需要添加输入校验功能:仅允许用户输入合法整数值,若输入字母、非数字字符或小数(如"3.00"),则显示错误信息并要求重新输入。原代码如下:
#include <iostream> #include <cmath> using namespace std; long long byaka(long long a, long long b, long long& k, long long& w) { if (b == 0) { k = 1; w = 0; return a; } long long d = byaka(b, a % b, k, w); k -= (a / b) * w; swap(k, w); return d; } int main() { long long a, b, c, k, w, d; cout << "A B C: \n"; cin >> a >> b >> c; d = byaka(a, b, k, w); while (c % d != 0) { cout << "Impossible! Vvedite A B C: \n"; cin >> a >> b >> c; d = byaka(a, b, k, w); } long long t = c / d * k, t2 = b / d; if (t == 0) cout << 0 << " " << c / d * w; if (t > 0) cout << t + t2 * (-(t / t2)) << " " << c / d * w - a / d * (-(t / t2)); if (t < 0) cout << t + t2 * (-((t - t2 + 1) / t2)) << " " << c / d * w - a / d * ((-((t - t2 + 1) / t2))); }
实现思路
要实现严格的整数输入校验,需处理两种核心异常:输入非数字字符、输入含小数点的小数。通过封装输入校验函数完成,核心步骤如下:
- 尝试用
cin读取long long值,若读取失败(输入非法字符),重置输入流状态并清空缓冲区残留内容。 - 若读取成功,检查输入流中是否有剩余字符(如小数点),确保输入是纯整数。
- 循环校验流程,直到用户输入合法整数。
修改后的完整代码
#include <iostream> #include <cmath> #include <limits> #include <string> using namespace std; // 原扩展欧几里得算法函数保留 long long byaka(long long a, long long b, long long& k, long long& w) { if (b == 0) { k = 1; w = 0; return a; } long long d = byaka(b, a % b, k, w); k -= (a / b) * w; swap(k, w); return d; } // 校验并获取单个合法long long整数 long long getValidLongLong(const string& prompt) { long long num; while (true) { cout << prompt; cin >> num; // 处理非数字输入 if (cin.fail()) { cout << "错误:请输入合法整数!\n"; cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } // 处理小数或多余字符输入 char remaining; if (cin.get(remaining) && remaining != '\n') { cout << "错误:请输入纯整数,禁止小数或多余字符!\n"; cin.ignore(numeric_limits<streamsize>::max(), '\n'); continue; } return num; } } // 批量获取合法的A、B、C值 void getValidABC(long long& a, long long& b, long long& c, const string& prompt) { cout << prompt << "\n"; a = getValidLongLong("输入A: "); b = getValidLongLong("输入B: "); c = getValidLongLong("输入C: "); } int main() { long long a, b, c, k, w, d; // 首次输入校验 getValidABC(a, b, c, "请输入A B C的值"); d = byaka(a, b, k, w); // 无解时重新输入并校验 while (c % d != 0) { cout << "Impossible! 请重新输入A B C:\n"; getValidABC(a, b, c, ""); d = byaka(a, b, k, w); } // 计算并输出解 long long t = c / d * k, t2 = b / d; if (t == 0) cout << 0 << " " << c / d * w; if (t > 0) cout << t + t2 * (-(t / t2)) << " " << c / d * w - a / d * (-(t / t2)); if (t < 0) cout << t + t2 * (-((t - t2 + 1) / t2)) << " " << c / d * w - a / d * ((-((t - t2 + 1) / t2))); }
代码说明
getValidLongLong:负责单个整数的校验,覆盖非数字、小数、多余字符等异常输入场景。getValidABC:封装三个整数的输入流程,提升代码可读性。- 输入流处理:通过
cin.clear()重置错误状态,cin.ignore()清空缓冲区,避免后续读取受残留输入影响。
内容的提问来源于stack exchange,提问作者Feldmanjoe
相关产品推荐
相关产品推荐

