程序要求用户输入非重复数字c ++

时间:2014-09-30 20:09:50

标签: c++ function

我在一个程序中编写了一个函数,用于输入一个唯一的数字,但它不起作用。 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();
}

4 个答案:

答案 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应该适用哪个员工,所以我只是将代码注释掉了。