#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
вернуть avector
индексов вместо только первого совпадения, в качестве альтернативы заставить его начать поиск из somestartIndex
и вызывать его повторно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;
}
}