0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 54

Осуществить поиск по полям класса

14.11.2016, 05:58. Показов 3265. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется код. Поиск в нём получается осуществить, только сразу по всем полям(т.е. чтобы все данные были введены). Помогите написать так, чтобы можно было искать отдельно по каждому полю.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include "commun.h"
#include <sstream>
 
 
template <typename T>
std::string toString(T val)
{
  std::ostringstream oss;
  oss << val;
  return oss.str();
}
 
 
Oplata::Oplata(int HouseNumber, int FlatNumber, string Surname,  pay_type Vid, string Date, float Sum, float Percent, int Prosrocheno)
{
 this->HouseNumber = HouseNumber;
 this->FlatNumber = FlatNumber;
 this->Surname = Surname;
 this->Vid = Vid;
 this->Date = Date;
 this->Sum = Sum;
 this->Percent = Percent;
 this->Prosrocheno = Prosrocheno;
}
 
  istream &operator >>(istream &in,Oplata &A)
    {
 
     in >> A.Surname; //дописать остальные и доделать оформление
     in >> A.HouseNumber;
     in >> A.Date;
     in >> A.FlatNumber;
     string p_type;
     in >> p_type;
     if(p_type == "e")
     {
        A.Vid = electricity;
     }
     else if (p_type == "g"){
        A.Vid = gas;
     }
     else if(p_type == "r")
        {
        A.Vid = running_water;
     }
     else {
        A.Vid = flatpay;
     }
     in >> A.Percent;
     in >> A.Prosrocheno;
     return in;
 
 
 
    }
 
 
 
   ostream &operator <<(ostream &out,Oplata A)
    {
        out << A.Surname<<":"<<endl;
        out << toString(A.HouseNumber)<<endl;
        out << toString(A.FlatNumber)<<endl;
        out << toString(A.Vid)<<endl;
        out << A.Date<<endl;
        out << toString(A.Sum)<<endl;
        out << toString(A.Percent)<<endl;
        out << toString(A.Prosrocheno)<<endl;
 
        return out;
    }
 
 
   bool Oplata ::  operator <(const Oplata& v) const
   {
 
     return this ->Surname < v.Surname;
   }
 
  bool Oplata ::  operator >(const Oplata& v) const
   {
 
     return this ->Surname > v.Surname;
   }
 
 
 
    /* bool Oplata::operator == (const Oplata& v)
    {
       return this -> Surname==v.Surname && this ->  HouseNumber==v.HouseNumber && this ->  Date ==v.Date &&this ->  FlatNumber ==v.FlatNumber && this ->  Vid ==v.Vid && this ->  Sum ==v.Sum && this ->  Percent ==v.Percent && this ->  Prosrocheno ==v.Prosrocheno;
    } */
 
   /* bool operator==(const Oplata& f,const Oplata& s){
    if(f.Surname == s.Surname && f.HouseNumber == s.HouseNumber && f.Date == s.Date && f.FlatNumber == s.FlatNumber && f.Vid == s.Vid && f.Sum == s.Sum && f.Percent == s.Percent && f.Prosrocheno == s.Prosrocheno)
    return true;
    else
    return false;
    };*/
 
 
    bool operator==(const Oplata& f,int val ){
    if(f.FlatNumber==val)
    return true;
    else
    return false;
    };
 
 
    void Oplata::set_sum(float value)
    {
      this->Sum = value;
    }
 
 
/*int LinearSearch(int *x, int k, int key){
  int i = 0;
  for ( i = 0 ; i < k ; i++ )
    if ( x[i] == key )
      break;
  return i < k ? i : -1;
}
*/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#ifndef COMMUN_H
#define COMMUN_H
 
#include <string>
#include <cstdlib>
 
 
 
using namespace std;
 
 
enum pay_type {flatpay, gas, running_water, electricity};
 
struct Oplata{
 
 
 
    int HouseNumber;
    int FlatNumber;
    string Surname;
    pay_type Vid;
    string Date;
    float Sum;
    float Percent;
    int Prosrocheno;
 
 
    Oplata(int HouseNumber, int FlatNumber, string Surname,  pay_type Vid, string Date, float Sum, float Percent, int Prosrocheno);
    friend istream &operator >>(istream &in,Oplata &A);
    friend ostream &operator <<(ostream &out,Oplata A);
   // bool operator ==(const Oplata& v);
    //friend bool operator==(const Oplata& f,const Oplata& s);
    friend bool operator==(const Oplata& f,int val );
    bool operator >(const Oplata& v) const;
    bool operator <(const Oplata& v) const;
    void set_sum(float value);
 
    //int LinearSearch(int *x, int k, int key);
 
 
 
 
};
 
#endif // COMMUN_H

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#include "commun.h"
#include <iostream>
#include <vector>
#include <cstring>
#include <cstdlib>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <queue>
#include <stack>
#include <functional>
 
 
using namespace std;
 
void save_to_file(queue <Oplata> q)
{
ofstream f;
f.open("report.txt");
while (!q.empty())
{
  f << q.front();
  q.pop();
}
f.close();
}
 
 
void reverse_save(queue <Oplata> q){
stack <Oplata> s;
 
while (!q.empty())
{
  s.push(q.front());
  q.pop();
}
ofstream f;
f.open("report_rev.txt");
while(!s.empty())
{
  f << s.top();
  s.pop();
}
f.close();
}
 
 
struct cmp
{
cmp(int const& h, int const& f, string const& s, pay_type t,string  d) : house(h), flat(f), surname(s), type(t), date(d) { }
 bool operator () (Oplata const& o)
 {
     return ((o.HouseNumber == house) && (o.FlatNumber==flat) &&(o.Surname== surname)&&(o.Vid==type)&&(o.Date==date));
 }
  private: int house; int flat; string surname; pay_type type;string date;
};
 
/*struct cmp
{
    cmp (int  h, int f) : house(h), flat(f) {}
    void operator () (Oplata const& o)
    {
      if ((o.HouseNumber == house)&& (o.FlatNumber==flat)) lst.push_back(o);}
      vector <Oplata> get() {return lst;};
 
 
 
    private: vector<Oplata> lst;  int house; int flat;
};*/
 
/*struct cmp1
{
    cmp1 (int  f) : flat(f) {}
    void operator () (Oplata const& o)
    {
      if (o.FlatNumber==flat) lst.push_back(o);}
      vector <Oplata> get() {return lst;};
 
 
 
    private: vector<Oplata> lst;  int flat;
};*/
 
int main()
{
    Oplata A (1, 10, "Ivanov", gas, "01.01.2001", 555.44, 1.5, 5);
    Oplata B (1, 20, "Aivanov", electricity, "01.01.2001", 896.12, 0, 0);
    Oplata C (3, 33, "Sidorov", electricity, "04.04.2002", 251.11, 0, 0);
 
    vector <Oplata> Oplati;
    Oplati.push_back(A);
    Oplati.push_back(B);
    Oplati.push_back(C);
 
 
    vector <Oplata> :: iterator it;
 
    queue <Oplata> q;
 
 
    it = find_if(Oplati.begin(), Oplati.end(), cmp( 3, 33, "Sidorov", electricity, "04.04.2002"));
 
 
   /* cmp ff = for_each(Oplati.begin(), Oplati.end(), cmp(20));
    vector <Oplata> b = ff.get();
    ostream_iterator <Oplata> foit (cout, "\n\n");
    copy (b.begin(), b.end(), foit);*/
 
 
 
    if(it != Oplati.end())
    {
      cout << "Znachenie naideno" << endl;
      cout << *it;
      q.push (*it);
    }
    else
    {
      cout << "Znachenie ne naideno" << endl;
    }
 
 
    cout<<"/////////////////////////"<<endl;
 
 
 
    /*vector<Oplata> v {{1, 10, "Ivanov", gas, "01.01.2001", 555.44, 1.5, 5}, {1, 10, "Aivanov", electricity, "01.01.2001", 896.12, 0, 0}, {3, 33, "Sidorov", electricity, "04.04.2002", 251.11, 0, 0}};
    vector <Oplata> :: iterator yt = find_if(v.begin(), v.end(), bind(equal_to<string>(), bind(&Oplata::Surname,  ), "Ivanov");*/
 
 
 
 
 
 
 
    Oplata D (3, 33, "Petrov", electricity, "04.04.2002", 251.11, 0, 0);
 
 
    /*it = find(Oplati.begin(), Oplati.end(), D);
 
    if(it != Oplati.end())
    {
      cout << "Znachenie naideno" << endl;
      cout << *it;
      q.push(*it);
    }
    else
    {
      cout << "Znachenie ne naideno" << endl;
    }
 
 
    it = find(Oplati.begin(), Oplati.end(), A);
 
    if(it != Oplati.end())
    {
      cout << "Znachenie naideno" << endl;
      cout << *it;
      q.push (*it);
    }
    else
    {
      cout << "Znachenie ne naideno" << endl;
    }*/
 
    cout<<"/////////////////////////"<<endl;
 
    save_to_file(q);
 
    reverse_save(q);
 
 
 
    cout << "Do sortirovki" << endl;
    ostream_iterator <Oplata> oit (cout, "\n\n");
    copy (Oplati.begin(), Oplati.end(), oit);
 
    // сортировка
 
    sort(Oplati.begin(), Oplati.end());
    cout << "Posle sortirovki" << endl;
    copy (Oplati.begin(), Oplati.end(), oit);
 
    cout<<"/////////////////////////"<<endl;
 
    if(binary_search(Oplati.begin(), Oplati.end(), B))
    {
        cout << "Найдено!" << endl;
    }
 
    else
    {
        cout << "Не найдено!" << endl;
    }
 
    cout<<"/////////////////////////"<<endl;
 
    Oplati.erase(Oplati.begin()+1);
 
    copy (Oplati.begin(), Oplati.end(), oit);
 
    cout<<"/////////////////////////"<<endl;
 
    Oplati[1].set_sum(999);
 
    copy (Oplati.begin(), Oplati.end(), oit);
 
    if(A==10)
    {
        cout<<"Hi!"<<endl;
    }
 
 
 
 
 
 
 
 
 
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2016, 05:58
Ответы с готовыми решениями:

Кто знает как в Access осуществить поиск по полям
Смысл вопроса в следующем. Есть таблица, в которой очень много полей и записей. На основании нее создана форма. Нужно сделать поиск по 4-м...

Посоветуйте, как осуществлять быстрый поиск по полям класса?
Создаю класс (допустим myClass) в котором есть несколько полей x,y,a,b,c итд. Далее создаю List&lt;myClass&gt; listtile = new...

Как осуществить суммирование в БД по нескольким полям?
Приветствую! Есть БД. В ней 3 поля: Номер вызывающего абонента, Номер вызываемого абонента, Продолжительность разговора. Любой абонент...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.11.2016, 09:18
C++
1
2
3
4
5
string Surname = "Sidorov";
it = find_if(Oplati.begin(), Oplati.end(), [Surname](const Oplata &o){ return o.Surname == Surname; });
//...
int HouseNumber = 3;
it = find_if(Oplati.begin(), Oplati.end(), [HouseNumber](const Oplata &o){ return o.HouseNumber == HouseNumber; });
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.11.2016, 09:38
Создайте набор предикатов и передавайте их как параметр к алгоритму поиска.

Добавлено через 4 минуты
Либо создайте функцию поиска, передавайте в неё последним параметром значение по какому полю необходимо искать и далее, в зависимости от значения атрибута, вызывайте соответствующую функцию поиска. Набор значений логичнее всего было бы обернуть в enum class, а в функции поиска switch, либо ассоциативный массив типа enum => указатель на функцию. Такой вариант в некоторых ситуациях подходит лучше, но в целом он мне кажется менее годным, чем тот, что я предложил в начале. Хотя бы потому, что он не совместим с STL и многое надо писать руками.
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 54
14.11.2016, 12:44  [ТС]
В принципе всё работает, только если должно быть два результата, то он выдаёт первый из них, как сделать, чтобы получалось оба?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.11.2016, 12:53
Обычный цикл чем не подходит?
C++
1
2
string Surname = "Sidorov";
it = for_each(Oplati.begin(), Oplati.end(), [Surname](const Oplata &o){ if (o.Surname == Surname) cout << o; });
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 54
14.11.2016, 12:54  [ТС]
И как ещё осуществить корректно поиск по типу платежа?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.11.2016, 12:59
Цитата Сообщение от Blimbablux Посмотреть сообщение
как сделать, чтобы получалось оба?
Либо складировать результат в коллекцию и возвращать из функции поиска, либо обрабатывать её сразу при проходе.
0
0 / 0 / 0
Регистрация: 14.09.2015
Сообщений: 54
14.11.2016, 13:00  [ТС]
А можно пожалуйста реализацию?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.11.2016, 13:53
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <algorithm>
#include <iostream>
#include <vector>
 
struct S
{
    int x, y;
};
 
void Print(const S &s)
{
    std::cout << "(" << s.x << ", " << s.y << ")\n";
}
 
bool FindByX(const S &s, const int val)
{
    return s.x == val;
}
 
bool FindByY(const S &s, const int val)
{
    return s.y == val;
}
 
template <typename Pred, typename Fn>
void ExecWithEqualKey(const std::vector<S> &v, Pred &pr, const int key, Fn &fn)
{
    for (const auto &s :v)
        if (pr(s, key))
            fn(s);
}
 
int main()
{
    const std::vector<S> v = {{1, 2}, {1, 3}, {0, 0}};
    ExecWithEqualKey(v, FindByX, 1, Print);
    ExecWithEqualKey(v, FindByY, 3, Print);
}
Добавлено через 4 минуты
В данном случае наверное правильней было бы даже сделать функтор с сохранением состояния. Что-то типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct FindByX
{
    FindByX(const int val) : m_val(val) {}
    bool operator()(const S &s) const
    {
        return s.x == m_val;
    }
private:
    const int m_val;
};
 
bool FindByY(const S &s, const int val)
{
    return s.y == val;
}
 
template <typename Pred, typename Fn>
void ExecWithEqualKey(const std::vector<S> &v, const Pred &pr, Fn &fn)
{
    for (const auto &s :v)
        if (pr(s))
            fn(s);
}
 
...
 
ExecWithEqualKey(v, FindByX(1), Print);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2016, 13:53
Помогаю со студенческими работами здесь

Как осуществить в дельфи осуществить поиск по таблице из другой формы?
Очень выручите, плизз

Доступ к полям класса через переменные другого класса
Уважаемые коллеги! Почему в моделях Аnylogic для упрощения доступа к полям одного класса (класс А) вводится в другой класс (класс В)...

Для чего ещё может быть нужен конструктор класса кроме присвоения полям класса начальных значений?
Для чего ещё может быть нужен конструктор класса кроме присвоения полям класса начальных значений?

Как программно осуществить привязку TextBox к полям таблицы базы данных?
Здравствуйте, у меня вопрос. Вот если с помощью функций Visual Studio осуществлять привязку, то в окне свойства нужно свойство из группы...

Обращение в методах класса к полям класса
Добрый вечер! Подскажите пожалуйста правильное обращение в методах класса к полям класса. class X {char name ; double zar; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
Инференс ML моделей в Java: TensorFlow, DL4J и DJL
Javaican 05.11.2025
Python захватил мир машинного обучения - это факт. Но когда дело доходит до продакшена, ситуация не так однозначна. Помню проект в крупном банке три года назад: команда data science натренировала. . .
Mapped types (отображённые типы) в TypeScript
Reangularity 03.11.2025
Mapped types работают как конвейер - берут существующую структуру и производят новую по заданным правилам. Меняют модификаторы свойств, трансформируют значения, фильтруют ключи. Один раз описал. . .
Адаптивная случайность в Unity: динамические вероятности для улучшения игрового дизайна
GameUnited 02.11.2025
Мой знакомый геймдизайнер потерял двадцать процентов активной аудитории за неделю. А виновником оказался обычный генератор псевдослучайных чисел. Казалось бы - добавил в карточную игру случайное. . .
Протоколы в Python
py-thonny 31.10.2025
Традиционная утиная типизация работает просто: попробовал вызвать метод, получилось - отлично, не получилось - упал с ошибкой в рантайме. Протоколы добавляют сюда проверку на этапе статического. . .
C++26: Read-copy-update (RCU)
bytestream 30.10.2025
Прошло почти двадцать лет с тех пор, как производители процессоров отказались от гонки мегагерц и перешли на многоядерность. И знаете что? Мы до сих пор спотыкаемся о те же грабли. Каждый раз, когда. . .
Изображения webp на старых x32 ОС Windows XP и Windows 7
Argus19 30.10.2025
Изображения webp на старых x32 ОС Windows XP и Windows 7 Чтобы решить задачу, использовал интернет: поисковики Google и Yandex, а также подсказки Deep Seek. Как оказалось, чтобы создать. . .
Passkey в ASP.NET Core identity
stackOverflow 29.10.2025
Пароли мертвы. Нет, серьезно - я повторяю это уже лет пять, но теперь впервые за это время чувствую, что это не просто красивые слова. В . NET 10 команда Microsoft внедрила поддержку Passkey прямо в. . .
Последние результаты исследования от команды MCM (октябрь 2025 г.)
Programma_Boinc 29.10.2025
Последние результаты исследования от команды MCM (октябрь 2025 г. ) Поскольку мы продолжаем изучать гены, которые играют ведущую роль в развитии рака, в рамках проекта "Картирование раковых. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru