我目前正在学习c++。我陷入了这个小问题,只有一个例外。
一个程序要求用户在一个数组中输入5个整数。我需要该程序来管理一个异常,该异常请求在元素已经存在的情况下再次输入该元素。
这是我的代码,我计算出了全局结构,但问题是如果你输入0,程序会抛出一个异常"已经存在";,那不是我想要的结果。我知道这是从哪里来的,T[j]没有在for循环中定义,但我不知道如何处理它。有人能帮我改进它吗?其他解决方案也受到欢迎。
#include<iostream>
#include <vector>
#include<cstdlib>
using namespace std;
int main(){
int i=0,j=0;
int temp;
vector<int>T(5);
do{
try{
cout<<"user input "<<(i+1)<<":";
cin>>temp;
//T[j]= 'a000000000000000000'; //I tried to define T[j], that's maximum I can do
for(j=0;j<=i;j++){
if(T[i]==T[j])
throw(0);
}
T[i]=temp;
i++;
}
catch(const int){
cout<<"Error: value already exists, try again"<<endl;
}
} while(i<sizeof(T)/sizeof(int));
for(i=0;i<sizeof(T)/sizeof(int);i++){
cout<<T[i]<<endl;
}
return 0;
}
此行创建一个包含5个int的向量。矢量中的所有int都为零:
vector<int>T(5);
这条线运行一个循环。由于i
为零,它运行循环一次,其中j
等于零,因为j<=i
为真,因为它们都为零。
for(j=0;j<=i;j++){
这行检查T[i]
是否等于T[j]
,因为i
和j
都为零,而T[0]
等于T[0]
。
if(T[i]==T[j])
这一行抛出一个异常。
throw(0);
你发现虫子了吗?也许您不想运行j
等于i
的循环。也许您想在j<i
而不是j<=i
时循环。因此,如果i
为5,则j
从0变为4,而不是0变为5;如果i
为0,则循环根本不运行。
此外,正如Mark Ransom所指出的,这是错误的:
sizeof(T)/sizeof(int)
应该是
T.size()
sizeof(T)/sizeof(int)
适用于数组,但不适用于向量。您需要T.size()
。
如果不要求数字以与输入相同的顺序输出,那么std::set(或std::unordered_set(将很好地工作
#include <iostream>
#include <set>
int main()
{
constexpr int NUMBERS_TO_READ{5};
std::set<int> numbers;
int i = 0;
do
{
int temp;
std::cout << "user input " << (i+1) << std::endl;
std::cin >> temp;
if (numbers.find(temp) != numbers.end())
{
//temp is already in the set
std::cout << "Value " << temp << " already exists, try again!" << std::endl;
}
else
{
//temp isn't in the set. add it.
numbers.insert(temp);
i++;
}
}
while (i < NUMBERS_TO_READ);
for (const auto num : numbers) std::cout << num << std::endl;
}