Страница 2 из 2

Re: Сортировка

Добавлено: 20 май 2010, 18:34
artemi
Я делал вывод из вектора не получилось
Если нетрудно покажите как это сделать
Зарание спасибо

Re: Сортировка

Добавлено: 20 май 2010, 18:50
Albor
можно использовать индекс как при обращении к обычному массиву (v).

Re: Сортировка

Добавлено: 20 май 2010, 19:48
artemi
все заработало!!
огромное спасиба!!!!

Re: Сортировка

Добавлено: 23 май 2010, 16:16
artemi
Помогите удалить заданную строку из структуры

Код: Выделить всё

#include <iostream>
#include <iterator>
#include <conio.h>
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <vector>


using namespace std;

struct Perech
{int nomer;
char outpunkt[20];
char inpunkt[20];
int cost;
int mest;
};

template<class T>
class vokzal
{
 private:
  Perech *px;
  int n;
  int f;
    std::vector<Perech> v;
    struct NameSortPred   {  bool operator()(const Perech& a, const Perech& b) const { return a.outpunkt<b.outpunkt;}};
  struct DateSortPred   {  bool operator()(const Perech& a, const Perech& b) const { return a.nomer<b.nomer;}};
 public:
  vokzal(){n=0;px=NULL;}
  ~vokzal(){n=0;if(px!=NULL)delete[]px;} 
   void newBD();
   void output();
   void sortByName();
   void del();
  };


template<class T>
void vokzal<T>::newBD()
{
  int i;
cout<<"Kolichestvo zapisey=";cin>>n;
 if(px!=NULL)delete[] px;
  px=new Perech[n];
 if(px==NULL){cout<<"Net pamyati\n";getch();n=0;return;}
  //создание базы данных
 for(i=0;i<n;i++)
 {cout<<"Nomer avtobusa:";cin>>px[i].nomer;
  cout<<"Punkt otpravleniya: ";cin>>px[i].outpunkt;
  cout<<"Punkt naznacheniya: ";cin>>px[i].inpunkt;
   cout<<"Stoimost bileta: ";cin>>px[i].cost;
  cout<<"Kolichestvo mest: ";cin>>px[i].mest;
  cout<<endl;
  v.push_back(px[i]);
 }cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{
   if (v.size() == 0)
   cout << "Empty" << endl;
 clrscr();
 cout.setf(ios::left);
 cout<<endl<<"Baza dannuih 'Avtovokzal'\n"<<endl;
 cout<<"N"<<" "<<setw(6)<<"Nomer"<<setw(12)<<"Otpravlenie"<<setw(11)<<"Pribuitie"
 <<setw(7)<<"Vremya"<<setw(17)<<"kolichestvo mest"<<setw(8)<<"Stoimost"<<endl;
  for (size_t i = 0; i < v.size(); i++){
   {cout.setf(ios::left); i++;
 cout<<setw(3)<<i<<setw(6)<<v[i-1].nomer<<setw(12)<<v[i-1].outpunkt<<setw(11)<<v[i-1].inpunkt
 <<setw(17)<<v[i-1].mest<<setw(8)<<v[i-1].cost<<endl;
i--; }
 }
    getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
 }
template<class T>
void vokzal<T>::del(){
output();
cout<<"vvedite nomer stroki";cin>>n;
v.erase(v.begin(),v.begin()+n);
output();
}
int main(){
 vokzal<Perech> a;
 a.newBD();
 a.sortByName();
 a.output();
 return 0;
 }

Re: Сортировка

Добавлено: 23 май 2010, 17:53
L.A.V.
В функции del() используй erase c одним аргументом, в качестве которого выступает итератор указывающий на элемент который необходимо удалить.
в твоем случае:

Код: Выделить всё

v.erase(v.begin() + (n-1)); //n-1, так как нумерация элементов начинается с нуля
И еще, классное решение по выводу вектора на экран, как говорится, мы не ищем легких путей ;)
Вместо того чтобы каждую итерацию инкрементировать, 5 раз вычитать, а потом еще раз декрементировать,
выполни одно единственное сложение в одном месте. Код станет нагляднее и понятнее :)

Re: Сортировка

Добавлено: 23 май 2010, 18:20
artemi
спасибо за помошь!
попробую так

Re: Сортировка

Добавлено: 23 май 2010, 18:34
artemi
огромное спасиба !!!!!!
может еще подскажешь как сдесь поиск запписи в структуре сделать с выводом ее на экран?
вот добавил код:

Код: Выделить всё

#include <iostream>
#include <iterator>
#include <conio.h>
#include <fstream.h>
#include <iomanip.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
#include <vector>


using namespace std;

struct Perech
{int nomer;
char outpunkt[20];
char inpunkt[20];
int cost;
int mest;
};

template<class T>
class vokzal
{
 private:
  Perech *px;
  int n;
  int f;
    std::vector<Perech> v;
    struct NameSortPred   {  bool operator()(const Perech& a, const Perech& b) const { return a.outpunkt<b.outpunkt;}};
    struct DateSortPred   {  bool operator()(const Perech& a, const Perech& b) const { return a.nomer<b.nomer;}};
    struct SearchPred {  char Search[20];  bool operator()(const Perech& a) const { return a.outpunkt==Search ;} };
 public:
  vokzal(){n=0;px=NULL;}
  ~vokzal(){n=0;if(px!=NULL)delete[]px;}
   void newBD();
   void output();
   void sortByName();
   void del();
   bool Search();
  };


template<class T>
void vokzal<T>::newBD()
{
  int i;
cout<<"Kolichestvo zapisey=";cin>>n;
 if(px!=NULL)delete[] px;
  px=new Perech[n];
 if(px==NULL){cout<<"Net pamyati\n";getch();n=0;return;}
  //ñîçäàíèå áàçû äàííûõ
 for(i=0;i<n;i++)
 {cout<<"Nomer avtobusa:";cin>>px[i].nomer;
  cout<<"Punkt otpravleniya: ";cin>>px[i].outpunkt;
  cout<<"Punkt naznacheniya: ";cin>>px[i].inpunkt;
   cout<<"Stoimost bileta: ";cin>>px[i].cost;
  cout<<"Kolichestvo mest: ";cin>>px[i].mest;
  cout<<endl;
  v.push_back(px[i]);
 }cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{
   if (v.size() == 0)
   cout << "Empty" << endl;
 clrscr();
 cout.setf(ios::left);
 cout<<endl<<"Baza dannuih 'Avtovokzal'\n"<<endl;
 cout<<"N"<<" "<<setw(6)<<"Nomer"<<setw(12)<<"Otpravlenie"<<setw(11)<<"Pribuitie"
 <<setw(7)<<"Vremya"<<setw(17)<<"kolichestvo mest"<<setw(8)<<"Stoimost"<<endl;
  for (size_t i = 0; i < v.size(); i++){
   {cout.setf(ios::left); i++;
 cout<<setw(3)<<i<<setw(6)<<v[i-1].nomer<<setw(12)<<v[i-1].outpunkt<<setw(11)<<v[i-1].inpunkt
 <<setw(17)<<v[i-1].mest<<setw(8)<<v[i-1].cost<<endl;
i--; }
 }
    getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
 }
template<class T>
void vokzal<T>::del(){
output();
cout<<"vvedite nomer stroki";cin>>n;
v.erase(v.begin()+(n-1));
output();
}
template<class T>
bool vokzal<T>::Search()
 {      cout<<"Search: ";cin>>Search;
        std::vector<Perech>::iterator r = find_if(v.begin(), v.end(), SearchPred());
        return r != v.end();
    }
int main(){
 vokzal<Perech> a;
 a.newBD();
 a.sortByName();
 a.Search();
 a.del();
 a.output();
 return 0;
 }

Re: Сортировка

Добавлено: 23 май 2010, 23:59
L.A.V.
Я то подскажу. Главное чтоб от этой подсказки польза была ;)

Во первых давай определимся, что ты имеешь в виду когда пишешь "поиск по структуре".
Думаю правильнее будет поиск по вектору структур типа Perech. Поиск производится по полю outpunkt.
Или там, поиск по базе данных, хранящей записи об автобусных маршрутах. Искать нужно по станции прибытия.
Правильно сформулированный вопрос - половина ответа, а то и ответ полностью :)

Во первых, в предикат который ты создал нужно передать строку для сравнения.
Делаем это как то так:

Код: Выделить всё

struct SearchPred
	{ 
		private:
			char *searchWord;
		public:
			explicit SearchPred(char *search):searchWord(search) {} 
			bool operator()(const Perech&  a) const	{ return strcmp(&(a.outpunkt[0]), searchWord) == 0;	} 
			/*оператор == не подходит для лексикографического сравнения массивов символов,
			посему  используем strcmp*/
			
	};
Сразу оговорюсь, что точно не заню прав я в такой реализации предиката или нет. Так как особо с ними не работал. Но логически выглядит, вроде, правильно. И работает тоже так как того ожидается. (Если кто знает поправьте меня, если что не верно.)

Наверное ты заметил, что добавился конструктор, который должен вызываться явно.
Также обычный оператор == не подходит для лексикографического сравнения массивов символов,
для этого нужно использовать strcmp.

Лирическое отступление. Если ты вовсю используешь векторы и шаблоны. Почему остановился на массивах char, а не на простом и удобном string? И еще(как было замечено ранее) к чему тут шаблоны, тут "хаоса" и без них хватает. Все твои функции жестко привязаны только к одному типу структур. Поэтому использование шаблонов не оправдано.
Мой тебе совет любую реализацию сначала пиши без шаблонов. Когда есть что обобщать, прикрутить шаблоны не долго.

Далее соответственно твой Search должен представлять нечто следующее:

Код: Выделить всё

template<class T>
void vokzal<T>::Search()
 { 
	    char srch[20];
	    cout<<"Search: ";cin>>srch;
           //обрати внимание на вызов предиката 
           std::vector<Perech>::iterator r = find_if(v.begin(), v.end(), SearchPred(&srch[0]));
           //r , в случае удачи, указывает на найденный элемент,
           //если поиск не удачен r указывает на конец. 
	    if(r == v.end())
	    { 
               //сообщаем об ошибке
		cout << "Element " << srch << " is not contained in the data base!" << endl;
	     }
	     else
	     {
		/*если следовать стилю всех твоих функций,
                   то вывод найденного элемента на экран должен быть тут.*/
	      }
}
Вывод можешь и сам написать, ты это уже делал.
Работать с итераторами довольно просто. В данном случае чтобы получить доступ к полям структуры Perech тебе необходимо обращаться с итератором как с обычным указателем, то есть применить оператор разыменования указателя (оператор ->) либо применить разыменование с помощью постфиксного * и затем применить операцию доступа (оператор .).
Т. е. если r итератор, то r->structMember эквивалентно (*r).structMember.
Стоит учитывать, что у тебя могут быть несколько записей с одинаковым полем outpunkt. Что тогда будешь делать?
Как обработаешь такую ситуацию? Над этим стоит подумать.

И еще пара советов:
Перепиши код заново, аккуратненько, придерживаясь одного стиля форматирования и именования. Сядь, подумай, приложи усердие.(самому же потом приятно будет)
Добавь обработку ошибок хотя-бы элементарные if.
Добавь меню программы.
Добавь запись\чтение записей маршрутов из файла. Легче программу будет тестировать. Плюс получишь опыт работы с файлами.

Если не последовать советам, то ,уверен, следующий выложенный твой код по достоинству может занять одно из призовых мест на нескажунакакомсайте.

Книги для почитать в обязательном порядке:
Макконел "Совершенный Код". (главы 10, 11, 12, 13, 31 - в первую очередь!).
Кёнинг, Му "Эффективное программирование на С++".

Re: Сортировка

Добавлено: 24 май 2010, 18:02
artemi
Спасиба за код и за советы!!!

Re: Сортировка

Добавлено: 24 май 2010, 19:26
artemi
ни как не получается вывод данной строки.
подскажите как это по лучше сделать