我在一个程序中编写了一个函数,用于输入一个唯一的数字,但它不起作用。 for循环出了点问题。
我需要验证员工ID是否唯一。 我创建了一个名为employee的结构,“emp.id”是一个员工ID。当用户输入id时,它不应该与之前用户可能输入的先前Id相匹配。这只是主程序的一个功能,它验证员工ID是唯一的。
void uniquieid()
{
int check,i;
string code;
string tempemp1;
cout<< "enter id";
cin>> code;
while(!(num-1))
{
for(i=0;i<=num-1;i++)
{
if(emp[i].id.compare(code)==0)//comparing
{
check =1;
cout<<"enter id again";
break;
}
if(check=0) //csaasc
{
emp[i].id=code;
}
}
}
getch();
}
答案 0 :(得分:2)
如果输入ID的顺序并不重要,我会做类似的事情(注意:未经测试):
using EmpIds = std::set<std::string>;
void addUniqueId(EmpIds& ids)
{
std::pair<EmpIds::iterator, bool> inserted;
const char* again = "";
do {
std::cout << "enter id" << again;
again = " again";
std::string id;
if (!(std::cin >> id))
throw std::runtime_error("No more ids!");
inserted = ids.insert(id);
} while (!inserted.second);
}
答案 1 :(得分:0)
您可以发布员工结构吗?
因此,一切看起来都不错,但您的if
函数指的是emp
。
因此,您的结构中的某些东西会导致问题。
没有你的结构,任何回答的人都可能无法找到问题。
现在,我建议你做的就是将员工ID存储在一个向量中,然后使用for
循环遍历它。
你可以做到
void uniqueid() {
std::vector<std::string> empIds;
std::string code;
CODE TO STORE IDs INTO VECTOR HERE;
int vectorLength = empIds.size();
std::cout << "enter id";
std::cin >> code;
for (int i = 0; i < vectorLength; i++) {
if (empIds[i] == code) {
std::cout << "enter id again";
std::cin >> code;
} else {
empIds.push_back(code);
}
}
}
答案 2 :(得分:0)
首先,类似下面的内容应该有效。
map <string, bool> seen;
bool isUniqueId(string id)
{
return seen[id];
}
void addId(string id)
{
seen[id] = true;
}
从main()
开始,每当用户输入字符串id
时,请使用isUniqueId(id)
确保其唯一性,如果是唯一的,请致电addId(id)
。
编辑:(根据OP的要求)
使用地图后,您转换的代码可能如下所示。
// Global map, defaults to false
map <string, bool> seen; // seen map to store if an id is seen already or not.
void uniqueId()
{
bool good = true; // set up a good flag to check if id is good or not.
int numEmployees = 0; // Count to store number of employees with unique ids so far
string id;
cout<< "enter id\n";
cin>> id;
while(good)
{
good = false; // Assume this is unique!
if(seen[id]) // Check if we already saw this id before
{
good = true; // Alas! We already have seen this id
cout<<"enter id again\n";
continue; // If id already exists, ask for another id setting good = true;
// Note that the above continue is NOT required as loop will run again (good = true).
// Just for clarity sake.
}
else
{
// Voila, we have a new employee with unique id.
seen[id] = true; // Unique, mark as seen now
emp[numEmployees].id=code; // Note numEmployees here
numEmployees++; // Increment the count
}
}
getch();
}
在while循环结束时,您可以成功获取用户的唯一ID,否则会不断向用户询问新的id
。
答案 3 :(得分:0)
代码有很多问题,但可能看起来更像是这样:
void uniqueid() {
int check=1;
string code;
string tempemp1;
cout<< "enter id";
while(check) {
cin >> code;
check = 0;
for (int i = 0; i < num; ++i) {
if (emp[i].id.compare(code)==0) {
check = 1;
cout << "enter id again";
break;
}
}
if (check==0) {
/* emp[i].id=code; */
}
}
getch();
}
请注意int check=1;
从1开始表示代码需要重新输入。
所以while(check)
意味着虽然代码不是唯一的,但仍然继续。
for循环像以前一样进行比较,但请注意惯用形式。
另一个if (check==0)
在for循环之外,这意味着没有检测到重复项,因此可以使用code
。但是,我不确定code
应该适用哪个员工,所以我只是将代码注释掉了。