IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Сортировка, проблема с ней
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


У меня такая задача: создать массив объектов и отсортировать по любому полю. Делаю в Borland C++ 3.1. Проблема в сортировке. Выдает ошибку cannot convert 'avto' to 'int'. Вот, что писал:
#include <iostream.h>
#include <conio.h>
#include <string.h>
const int n=3;
class avto
{

char name[20];
int speed;
float volume;
public:
avto();
~avto();
void init(char *nam, int sp, float vol) {strcpy(name,nam), speed=sp, volume=vol;}
friend void out(avto av);
};
avto::avto()
{
strcpy(name," ");
speed=0;
volume=0;
}
avto::~avto()
{
strcpy(name," ");
speed=0;
volume=0;
}
void out(avto av)
{
cout<<av.name<<"\t"<<av.speed<<"\t"<<av.volume<<endl;
}
void sort(avto av);
int main()
{
clrscr();
int i,speed;
char *name;
float volume;
avto a[n];
for(i=0;i<n;i++)
{
cout<<"Input name "; cin>>name;
cout<<"Input speed "; cin>>speed;
cout<<"Input volume "; cin>>volume;
a[i].init(name,speed,volume);
}
cout<<"Ishodnie dannie"<<endl;
for(i=0;i<n;i++)
out(a[i]);
sort(a);
cout<<"Posle sortirovki"<<endl;
for(i=0;i<n;i++)
out(a[i]);
getch();
return 0;
}
void sort(avto av)
{
int i,w,p=1;
while (p)
{
p=0;
for(i=0;i<n;i++)
if(av[i].speed>av[i+1].speed)
{
w=av[i].speed;
av[i].speed=av[i].speed;
av[i+1].speed=w;
p=1;
}
}
}

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Сделать, чтобы работало - вот так:

#include <iostream.h>
#include <conio.h>
#include <string.h>
const int n=3;
class avto
{
char name[20];
float volume;
public:
int speed;

avto();
~avto();
void init(char *nam, int sp, float vol) {
strcpy(name,nam), speed=sp, volume=vol;
}
friend void out(avto av);
};

avto::avto()
{
strcpy(name," ");
speed=0;
volume=0;
}
avto::~avto()
{
strcpy(name," ");
speed=0;
volume=0;
}
void out(avto av)
{
cout<<av.name<<"\t"<<av.speed<<"\t"<<av.volume<<endl;
}
void sort(avto* av); // Чувствуешь разницу?
int main()
{
clrscr();
int i,speed;
char name[128];
float volume;
avto a[3];
for(i=0;i<n;i++) {
cout<<"Input name "; cin>>name;
cout<<"Input speed "; cin>>speed;
cout<<"Input volume "; cin>>volume;
a[i].init(name,speed,volume);
}
cout<<"Ishodnie dannie"<<endl;
for(i=0;i<n;i++)
out(a[i]);
sort(a);
cout<<"Posle sortirovki"<<endl;
for(i=0;i<n;i++)
out(a[i]);
getch();
return 0;
}
void sort(avto* av)
{
int i,p=1;
while (p)
{
p=0;
for(i=0;i<n;i++)
if((av)[i].speed>(av)[i+1].speed)
{
avto X = av[i];
av[i] = av[i + 1];
av[i + 1] = X;
p=1;
}
}
}
, но по-хорошему надо бы переписать программу полностью, чтобы она хоть сколько-нибудь соответствовала ООП-стилю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 20
Пол: Мужской

Репутация: -  0  +


Спасибо, теперь работает.
И заодно, если не сложно, расскажи вкратце про ООП-стиль. Я недавно программирую, поэтому о стилях мало что знаю.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Я имел в виду, что если уж ты пользуешься С++, то надо использовать преимущества, которые он предоставляет, а не писать на "С с классами"... Смотри:

#include <iostream.h>
#include <conio.h>
#include <string.h>

const int n=3;

class avto {
// заменяем поэлементные ввод и вывод на соотв. операторы (реализация - ниже)
friend istream& operator >> (istream& is, avto& av);
friend ostream& operator << (ostream& os, avto& av);

char name[20];
int speed;
float volume;

public:
avto(const avto& av) { // это вызывается когда делаешь avto X = av[i];
strcpy(name, av.name);
volume = av.volume;
speed = av.speed;
}

avto(); // конструктор по умолчанию...

int getSpeed() { // обеспечение доступа к необщему члену - speed
return speed;
}
};

// Теперь - реализация ввода объекта типа avto
// здесь все просто - вводим на каждой строке одно данное,
// после которого жмем Enter
istream& operator >> (istream& is, avto& av) {
is >> av.name;
is >> av.speed;
is >> av.volume;

return is;
}

// ну, и вывод того же объекта:
ostream& operator << (ostream& os, avto& av) {
os << av.name << "\t" << av.speed << "\t" << av.volume << endl;
return os;
}

// Конструктор по умолчанию
avto::avto(): speed(0), volume(0.0) // другая форма записи speed = 0 и volume = 0.0
{
strcpy(name,"<empty>"); // хотя можно было и оставить пробел, как было у тебя
}

void sort(avto* av);

int main()
{
clrscr();
int i;
avto a[3];
for(i = 0; i < n; i++) {
// меняем приглашение, поскольку изменился способ ввода данных
cout << "input \"name\" <enter>, \"speed\" <enter>, \"value\" <enter>" << endl;

// а вот так теперь вводится объект, причем можно реализовать
// операторы << и >> так, что этот же код без изменений будет
// работать и с файлами, а не только с cin...
cin >> a[i];
}

cout << "Ishodnie dannie" << endl;
for(i = 0; i < n; i++) cout << a[i]; // соответственно, вывод данных без out

sort(a); // сортируем

cout << "Posle sortirovki" << endl;
for(i = 0; i < n; i++) cout << a[i];

getch();
return 0;
}

void sort(avto* av)
{
int p = 1;
while(p) {
p = 0;
for(int i = 0;i < n-1; i++)
if(av[i].getSpeed() > av[i+1].getSpeed()) {
avto X = av[i];
av[i] = av[i + 1];
av[i + 1] = X;
p = 1;
}
}
}

У меня BC 3.1 не установлена, проверь, по-моему и там должно работать, я проверял на GCC.
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.11.2021 21:30
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name