Как мне реализовать цикл while для этой функции

#c

#c

Вопрос:

Я работаю над школьным проектом, в котором мы создадим контактную книгу. В одной из функций он должен находить контакты, используя имя.

Возникающая ошибка заключается в том, что в векторе отображается только один контакт. Я хочу, чтобы отображались все контакты с одинаковым именем.

Как мне реализовать цикл или счетчик (i ), чтобы он включал все контакты с одинаковым именем, а не просто принимал первый индекс?

Я новичок в C и ценю любую помощь 🙂

Моя функция:

 int findTargetFirstName(vector<Kontaktbok>amp; bok, string target) {
  for (int i = 0; i < bok.size(); i  )
    if (bok[i].fnamn == target) return i;
  return -1;

void search(vector<Kontaktbok>amp; bok) {
  if (bok.size() > 0) {
    string firstname;
    cout << "First name of the contact: ";
    getline(cin, firstname);
    int pos = findTargetFirstName(bok, firstname); 
    cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
    if (pos>=0) {
      cout << left;
      cout << setw(10) << bok[pos].fnamn << left
           << setw(15) << bok[pos].enamn << left
           << setw(20) << bok[pos].adress << left
           << setw(15) << bok[pos].pnummer <<left
           << setw(25) << bok[pos].epost <<left
           << setw(15) << bok[pos].telnummer << left << endl;
    }
    cout << "********************************************************************************" << endl;
  }
}
 

Комментарии:

1. Вместо того, чтобы возвращать при первом результате, добавьте его в std::vector и верните весь вектор после цикла for

2. вы, кажется, знаете std::vector , поэтому одним из возможных первых шагов было бы findTargetFirstName вернуть a vector индексов вместо только первого совпадения, в качестве альтернативы заставить его начать поиск из some startIndex и вызывать его повторно

3. Правильное отступление облегчит людям желание помочь вам.

Ответ №1:

Один из способов — добавить параметр, чтобы определить, с какого элемента начинать.

 int findTargetFirstName(vector<Kontaktbok>amp; bok, string target, int start = 0) {
    for (int i = start; i < bok.size(); i  )
        if (bok[i].fnamn == target) return i;
    return -1;
}


void search(vector<Kontaktbok>amp; bok) {
    if(bok.size() > 0) {
        string firstname;
        cout << "First name of the contact: ";
        getline(cin, firstname);
        int pos = findTargetFirstName(bok, firstname);
        cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
        while (pos>=0){ // change if to while
            cout << left;
            cout << setw(10) << bok[pos].fnamn << left
            << setw(15) << bok[pos].enamn << left
            << setw(20) << bok[pos].adress << left
            << setw(15) << bok[pos].pnummer <<left
            << setw(25) << bok[pos].epost <<left
            << setw(15) << bok[pos].telnummer << left << endl;
            pos = findTargetFirstName(bok, firstname, pos   1); // search for next contact
        }
        cout << "********************************************************************************" << endl;
    }
}
 

Другой способ заключается в том, чтобы функция findTargetFirstName возвращала вектор контактов, который удовлетворяет условию.

 vector<int> findTargetFirstName(vector<Kontaktbok>amp; bok, string target) {
    vector<int> ret;
    for (int i = start; i < bok.size(); i  )
        if (bok[i].fnamn == target) ret.push_back(i);
    return ret;
}


void search(vector<Kontaktbok>amp; bok) {
    if(bok.size() > 0) {
        string firstname;
        cout << "First name of the contact: ";
        getline(cin, firstname);
        vector<int> poses = findTargetFirstName(bok, firstname); // change type and variable
        cout << "Firstname, Lastname, Address, Pnummer, E-post, Telefonnummer" << endl;
        for (int pos : poses){ // change if to range-based for
            cout << left;
            cout << setw(10) << bok[pos].fnamn << left
            << setw(15) << bok[pos].enamn << left
            << setw(20) << bok[pos].adress << left
            << setw(15) << bok[pos].pnummer <<left
            << setw(25) << bok[pos].epost <<left
            << setw(15) << bok[pos].telnummer << left << endl;
        }
        cout << "********************************************************************************" << endl;
    }
}