所以这是我的代码:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
long int iterFunc(int);
long int recurFunc(int);
int main() {
int n;
while(true){
try{
cout << "Enter: ";
if (!(cin >> n))
throw("Type Error");
if (n < 0)
throw n;
else
if (n == 0)
break;
cout << "Iterative: " << iterFunc(n) << endl;
cout << "Recursive: " << recurFunc(n) << endl;
}
catch(int n){
cout << "Error. Enter positive number." << endl;
}
catch(...){
cin.clear();
cin.ignore(100, 'n');
cout << "Error. Please enter a number" << endl;
}
}
cout << "Goodbye!";
return 0;
}
long int iterFunc(int n){
vector<long int> yVec = {1, 1, 1, 3, 5};
if (n <= 5)
return yVec[n - 1];
else
for(int i = 5;i < n; i++){
long int result = yVec[i - 1] + 3 * yVec[i- 5];
yVec.push_back(result);
}
return yVec.back();
}
long int recurFunc(int n){
switch (n) {
case 1:
case 2:
case 3:
return 1;
break;
case 4:
return 3;
break;
case 5:
return 5;
break;
default:
return recurFunc(n - 1) + 3 * recurFunc(n - 5);
break;
}
}`
程序应该只接受一个整数,并使用迭代和递归实现返回函数的y。例:30,59433。如果用户输入多个用空格分隔的整数,我如何抛出错误消息?示例:"3 45 32"。我尝试使用if (cin.getline == ' ') throw("Error name")
,但程序仍然执行并返回输入中数字函数的y
类似的东西可以工作:
int main()
{
std::string str;
std::cout << "? : ";
std::getline(std::cin, str);
std::string::size_type pos(0);
int i = std::stoi(str, &pos);
if (pos != str.length())
return 1;
}
我发现旧代码中的一部分可能会派上用场。
int val;
do
{
cin>>val;
if(!cin){ //you can add more conditions here
cin.clear();
cin.sync();
/* additional error handling */
}
else{
break; //input is correct - leaving loop
}
}while(true); //or here
基本上,!cin
的作用是检查您实际想要写入的值的类型,因为无论如何都需要它来确定数据类型是否写入了val
的正确类型。这意味着;30〃;或";433〃;等等是整数(正确(;s";或";字符串";等等是字符串(或char*,如果我错了,请纠正我((不正确(。
这也意味着;3 45 32〃应解释为字符串,应导致另一个循环运行。
注意:我并没有真正测试这个代码,所以它可能是完全错误的。
编辑:好吧,经过一些测试,我意识到这段代码需要重新编写。
首先;3 45 32〃未被解释为字符串(现在可以理解(。相反,第一个数字(空白之前(被保存为整数,所有其他数字都存储在缓冲区中(下一个cin将用它填充(,我们可以避免再次使用cin.clear()
和cin.sync()
。
问题是,你可以接受第一个整数,忽略第一个空白之后的所有内容吗?如果没有,您将不得不将输入保存为字符串,并从中提取您想要的任何数据
为了在本次编辑中查找参考文献,我将保留原始答案。