Сортировка

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

artemi
Сообщения: 14
Зарегистрирован: 26 апр 2010, 18:12

Помогите найти ошибку не работает сортировка, Вот мой код:

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

#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; 
int h, 
min; 
};
struct Bilet
{
Perech pe;
int col; 
char tip; 
};

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 inputfile(); 
void newBD(); 
void output(); 
void redaktor(); 
int vuibor();
void outputFile(); 
void add(); 
void delt(); 
void sortByName();
};


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<<"Vremya otpravleniya: ";cin>>px[i].h>>px[i].min;
cout<<"Stoimost bileta: ";cin>>px[i].cost;
cout<<"Kolichestvo mest: ";cin>>px[i].mest;
cout<<endl;
v.push_back();
}cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{int i; 
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 ( i = 0; i < v.size(); i++){
if(v[i].h<10 && v[i].min<10) 
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<px[i-1].nomer<<setw(12)<<px[i-1].outpunkt<<setw(11)<<px[i-1].inpunkt<<"0"
<<setw(1)<<px[i-1].h<<":"<<"0"<<setw(3)<<px[i-1].min<<setw(17)<<px[i-1].mest<<setw(8)<<px[i-1].cost<<endl;
i--; }
else if(v[i].h<10) 
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<px[i-1].nomer<<setw(12)<<px[i-1].outpunkt<<setw(11)<<px[i-1].inpunkt<<"0"
<<setw(1)<<px[i-1].h<<":"<<setw(3)<<px[i-1].min<<setw(17)<<px[i-1].mest<<setw(8)<<px[i-1].cost<<endl;
i--; }
else if(v[i].min<10) 
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<px[i-1].nomer<<setw(12)<<px[i-1].outpunkt<<setw(11)<<px[i-1].inpunkt<<"0"
<<setw(1)<<px[i-1].h<<":"<<"0"<<setw(3)<<px[i-1].min<<setw(17)<<px[i-1].mest<<setw(8)<<px[i-1].cost<<endl;
i--; }
else
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<px[i-1].nomer<<setw(12)<<px[i-1].outpunkt<<setw(11)<<px[i-1].inpunkt<<"0"
<<setw(1)<<px[i-1].h<<":"<<setw(3)<<px[i-1].min<<setw(17)<<px[i-1].mest<<setw(8)<<px[i-1].cost<<endl;
i--; }
}
getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
}
int main(){
vokzal<Perech> a;
a.newBD();
a.sortByName();
a.output();
return 0;
}
mixkorshun
Сообщения: 2
Зарегистрирован: 20 май 2010, 02:28

А теперь взял и резво переписал на нормальный язык.. а это не код - а ужас какой то..
artemi
Сообщения: 14
Зарегистрирован: 26 апр 2010, 18:12

а в чем ужас моего кода
поясните пожалуйста
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ужасное форматирование. Код не читабелен в принципе. Я, например, не хочу даже тратить время на его чтение. Если кто-то и поможет, то это точно не я.

Ты ошибку-то опиши. Как проявляется то, что сортировка не работает?
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

У вас очень "хитроумная" функция вывода, я имею ввиду vokzal: :o utput(). Может поэтому не видно результата сортировки. А ужас вашего кода в том, что вы не хотите заняться отладкой самостоятельно, а предлагаете это сделать кому-либо из присутствующих. Тяжело другому человеку разбираться в неосмысленных именах переменных (для вас может что-то означает имя px, а для меня лично нет). Вы "обвешали" код темплейтами, но не используете их - это для чего? Покажите хоть одно шаблонное поле класса vokzal. Вы хоть проверили вектор после сортировки? Может он отсортирован? Беда в том, что не задан конкретный вопрос. Ваш вопрос выглядит примерно так: "Найдите и устраните мою ошибку"
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если кому интересно будет, могу предложить свой вариант шаблона-обёртки для функции qsort из стандартной библиотеки С/С++
Код cpp:
template <typename T>
void QuickSortCRT(T A[], int size)
{
class Helper
{
public:
static int Compare( const void *arg1, const void *arg2 )
{
T& p1 = *((T*)arg1);
T& p2 = *((T*)arg2);
if (p1 == p2)
{
return 0;
} else
{
return (p1 < p2)? -1 : 1;
}
}
};
// Вызов библиотечной функции...
if ((A != NULL) && (size > 1))
{
qsort(A, size, sizeof(T), Helper::Compare);
}
}




Использовать её довольно просто: на вход функции подаётся указатель на массив данных и число элементов в массиве.

P.S. Плохо, что при редактировании не сохраняются отступы для строк программного кода. Из-за этого код получается плохо читаемым.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

artemi, смотри функцию newBd(), строка v.push_back(). push_back (перевод на русский язык вслух не произносить! :) ) без параметра не используется. Код не должен был компилироваться.
Второе:

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

...if(v[i].h<10 && v[i].min<10) 
{cout.setf(ios::left); i++;
cout<<setw(3)<<i<<setw(6)<<px[i-1]...
Просчитай, что выйдет, если при i равном 0 условие будет истинным, куда обратится px[i-1]
artemi
Сообщения: 14
Зарегистрирован: 26 апр 2010, 18:12

вот у простил свой код: Может так вам будет удобней его прчитать

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

#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();
  };


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();
 }cout<<"Baza dannuih sozdana";getch();
}
template<class T>
void vokzal<T>: :o utput(){
{int i;
   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 ( i = 0; i < v.size(); i++){
   {cout.setf(ios::left); i++;
 cout<<setw(3)<<i<<setw(6)<<px[i-1].nomer<<setw(12)<<px[i-1].outpunkt<<setw(11)<<px[i-1].inpunkt
 <<setw(17)<<px[i-1].mest<<setw(8)<<px[i-1].cost<<endl;
i--; }
 }
    getch();
}
}
template<class T>
void vokzal<T>::sortByName()
{
sort(v.begin(),v.end(),DateSortPred());
 }
int main(){
 vokzal<Perech> a;
 a.newBD();
 a.sortByName();
 a.output();
 return 0;
 }
Тут функция ввода запсей и вывода записей работает просто нет сортировки(функция сортировки не сортирует)
может у кого есть другия решения как отсортировать эту структуру .
А насчет v.push_back(); если ее недобавлять в код то небудет вывода записи
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

artemi писал(а):А насчет v.push_back(); если ее недобавлять в код то небудет вывода записи
А не так должно быть?

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

 v.push_back(px[i]); 
Зачем вообще в функции ввода использовать массив Perech, если достаточно одной переменной, ведь все данные помещаются в вектор.
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

А, вот твоя ошибка: ты сортируешь вектор, а вывод делаешь из массива рх. То о чём я писал выше - данные хранятся в двух контейнерах.
Ответить