Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2018, 11:58   #1
pacman007
Новичок
Джуниор
 
Регистрация: 03.06.2018
Сообщений: 3
По умолчанию Не работает поиск по вектору и функция sort

Пишу программу которая должна иметь возможность поиска записи о студенте по имени, но при выполнении функции void poisc() не выдаёт данные а сразу переходит к else,также должна быть функция сортировки,void sort(), однако в ней выдаёт ошибки, перечитал уже кучу сайтов о том как она должна работать, но не один метод не помог, хотя скорее всего я делаю что то не так, прошу помочь с исправлением этих двух проблем.
Код:
#include<iostream>
#include<string>
#include<bitset>
#include<vector>//для работы вектора
#include<algorithm>
#include<ctime>
#include<locale>
#include <iterator>
using namespace std;
class grup
{
class student
{
string name;//имя
string last_name;//фамилия
int age;//возраст
public: 
//--------------------------------
student(string a="Ivan",string b="Ivanov",int c=23)//получение номера элемента
{name=a;
last_name=b;
age=c;}
//--------------------------------
string vivod()//вывод данных
{return "Фамилия: "+last_name+"\nИмя: "+name+"\nВозраст: "+to_string(age)+"лет\n";
cout<<endl;}
friend class grup;};
//--------------------------------
public:
vector <student> grupa;
void input()//ввод данных
{
	student D;// объект для ввода
	cout<<"Введите имя:"<<endl;
	cin>>D.name;
	cout<<"Введите фамилию:"<<endl;
	cin>>D.last_name;
	cout<<"Введите возраст:"<<endl;
	cin>>D.age;
	cout<<endl;
	grupa.push_back(D);// Добавление элемента в конец вектора
}
//--------------------------------
//void sort()//метод сортировки
//{
//    sort(grupa.begin(), grupa.end(), [](const  student& _Left, const student& _Right)//лямбда-выражение []()
//    { 
//        return _Left.age > _Right.age; 
//    }
//    );
//    for(auto elem:grupa)
//    cout << elem.age << endl;
//}
//--------------------------------
void poisc()//метод поиска
{
int sum;
int i;
string key;//ключ
student D;
cout<<"Введите имя для поиска"<<endl;
cin>>key;    
bool fnd = false;//флаг
for(int i = 0; !fnd && i < sum; i++) 
{
    fnd = grupa[i].name == key; 
}
if(fnd == true)
{
    cout<<"фамилия - "<<grupa[i].last_name;
    cout<<"Возраст - "<<grupa[i].age;
}
else {cout<<"ИНФОРМАЦИИ НЕТ"<<endl;}
}
//--------------------------------
void del()//удаление элемента
{int n;
cout<<"Введите номер элемента для удаления:"<<endl;
cin>>n;
grupa.erase(grupa.begin()+n-1);}//erase.begin-стирает следующий элемент вектора
//--------------------------------
student GetInd(int i)//возвращение значения элемента массива
{return grupa[i];}
};
//--------------------------------
int main()
{
setlocale(LC_ALL,"rus");
grup p;//объект для обращения
int n;//кол-во вводов
int des;//для свича
int sum=0;
bool loop=true;//для while
//--------------------------------
while (loop==true)
{
cout << "1-ввод записи" <<endl;
cout << "2-удаление записи" <<endl;
cout << "3-показать все записи" <<endl;
cout << "4-поиск по имени" <<endl;
cout << "5-сортировка по возрасту" <<endl;
cout << "0-выход из программы" <<endl;
cin >> des;
if (des==1)//ввод записи
    {
	cout<<"Сколько записей хотите ввести?"<<endl;
	cin>>n;
	sum=n+sum;
	for (int i=0; i<n;i++) 
	{p.input();}
    }
if (des==2)//удаление записи
    {
    p.del();
	sum=sum-1;
	for (int i=0; i<sum;i++) 
	{cout<<p.GetInd(i).vivod()<<endl;}
    }
if (des==3)//показать записи
    {
    for (int i=0; i<sum;i++) 
	{cout<<p.GetInd(i).vivod()<<endl;}
    }
if (des==4)//поиск по имени
    {p.poisc();}
//if (des==5)//сортировка по возрасту
//    {p.sort();}
if (des==0)//выход из программы
    {exit(0);
    break;}
    else continue;
}
return 0;
}

Последний раз редактировалось pacman007; 03.06.2018 в 12:53.
pacman007 вне форума Ответить с цитированием
Старый 03.06.2018, 12:26   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

1. отредактируйте пост и установите форматирование "код" - читать не возможно.
2. Сортировка вроде верно, однако, классическая ошибка auto у вас
Цитата:
for(auto elem:grupa)
такая запись вызывает КОПИРОВАНИЕ elem из вектора группа, копия (со всеми изменениями) уничтожается по окончании цикла. Вернее так

Для чтения:
Цитата:
for(const auto& elem:grupa)
Для внесения изменений в каждый элемент вектора:

Цитата:
for(auto& elem:grupa)
Так же и в случае указателей лучче писать
Цитата:
auto* n = new ...
хотя я так не делаю...но советчики на основе компилятора именно так советуют.

Для поиска можно использовать

Цитата:
auto it = std::find_if
Хотя у вас не задан некий сум

Цитата:
for(int i = 0; !fnd && i < sum; i++)
Нада так

Код:
for(size_t i = 0, sz = grupa.size(); !fnd && i < sz; ++i)
Обратите внимание, использовал тип size_t, т.к. все размеры контейнеров такие. При использовании int самолично встречал его переполнение, при загрузке текстур 512 х 512 х 512

Последний раз редактировалось alexzk; 03.06.2018 в 12:37.
alexzk вне форума Ответить с цитированием
Старый 03.06.2018, 12:35   #3
pacman007
Новичок
Джуниор
 
Регистрация: 03.06.2018
Сообщений: 3
По умолчанию

как сделать форматирование кода?
pacman007 вне форума Ответить с цитированием
Старый 03.06.2018, 12:38   #4
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от pacman007 Посмотреть сообщение
как сделать форматирование кода?
Выделить сообщение и кнопка # в панели.

Я обновил свой пост - перечитайте его (Ф5 ).
alexzk вне форума Ответить с цитированием
Старый 03.06.2018, 12:52   #5
pacman007
Новичок
Джуниор
 
Регистрация: 03.06.2018
Сообщений: 3
По умолчанию

Спасибо) поиск заработал, в сортировке просто название функции поменял и она заработала)

Последний раз редактировалось pacman007; 03.06.2018 в 12:57.
pacman007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает sort & compare? Asya7 Общие вопросы C/C++ 4 12.06.2016 21:24
Sendmail работает, функция mail() работает, но есть проблема. PavelNAndreev PHP 8 27.01.2014 12:45
Не работает метод SORT leonard Microsoft Office Excel 0 17.05.2011 13:18
Организация доступа к вектору посредством итератора jennya Visual C++ 2 03.10.2010 15:14
Создать массив по вектору. Dimati87 Помощь студентам 4 12.05.2009 11:06