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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2013, 18:43   #1
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию Сортировка

Добрый день. Есть программа, которая записывает в файл несколько объектов в двоичном виде, потом считывает. Как отсортировать считанные данные (объекты) по одному из полей? Или в данном случае имеет смысл использовать массив?
P.S. конечное количество объектов около 700.
Dima-War вне форума Ответить с цитированием
Старый 22.07.2013, 19:01   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Наработки есть?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 22.07.2013, 20:38   #3
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Полностью код выкладывать не буду, программа обширная получилась. Вот так выглядит сам класс:

Код:
class Library
{
protected:
	char title[128];
	int year;
	char descr[512];
public:
	void getFilm(); 
	void showFilm();
        friend int sortFilm();
};
А вот тут функция сортировки по году:

Код:
int sortFilm()
{
	int i = 1000;
	system("cls");
	int pos = 0;
	ifstream in("flBeta.dat", ios::binary);
	if (!in)
	{
		cout << "Не могу открыть файл. " << endl;
		system("pause");
		exit(1);
	}
	for (i = 1000; i < 6000; i += 1000)
	{
		in.read((char *) &film, sizeof(Library));
		in.seekg(pos, ios::beg);
		while (pos < sizeof(Library))
		{
			if ((int)film.year == i)
			{
				//film.showFilm();
				cout << "Условие выполняется. " << endl;
				break;
			}
			pos += sizeof(Library);
		}
		pos += sizeof(Library);
	}
        system("pause");
        return 0;
}
Расчитывал я на следующее. В файле 5 фильмов, годы выпуска 1000, 2000 и так до 5000. Сравниваю счеткик цикла с годом фильма, и если они совпадают, то показать информацию о фильме. Конечно такой метод сортировкой назвать сложно, но ничего другого в голову не пришло. Но не работает даже это. Если I == film.year, то информация все равно не показывается.

Последний раз редактировалось Dima-War; 22.07.2013 в 20:53.
Dima-War вне форума Ответить с цитированием
Старый 22.07.2013, 20:55   #4
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

В общем я щас посмотрел на свой код и увидел, что это полное дно и вообще странно, что он еще хоть как то работает Да и сортировать 1000 фильмов вот так в цикле тоже, наверное, не есть хорошо. Так что прошу помочь подобрать правильный вариант сортировки.
Dima-War вне форума Ответить с цитированием
Старый 22.07.2013, 22:15   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

По разным файлам раскидай фильмы если интересует только дата, либо в начале файла сунь структурку с позициями данных о фильмах по годам и их количеством, сможеш переходить от категории к категории без считывания всего под ряд и фильмы хранить при этом уже отсортированными ещё при добавлении, для остального можеш попробовать написать реляционную СУБД. Тут ты сможеш обойтись без массива если фильмов мало, если счёт идёт на тысячи то юзай память иначе скорость будет всё меньше и меньше.

Вот тебе сишный вариант твоей сортировки без проверок на ошибки. Авось помогёт.
Код:
#include <stdio.h>

typedef struct{
	char name[128];
	int year;
	char descr[512];
}FilmInf;

typedef void callback(FilmInf*);

int search(char* fname, int year, callback* show_film){
	FilmInf fi;
	FILE* fp;
	int read_num;
	fp = fopen(fname, "wb");
	while(!feof(fp)){
		fread(&fi, sizeof(FilmInf), 1, fp);
		if(fi.year == year){
			show_film(&fi);
			read_num++;
		}
	}
	fclose(fp);
	return read_num;
}
А правильным тут будет вариант считать блок структур в каком тебе нравится количестве в массив и сортировать тем же циклом его. Но понадобится тебе структурка указывающая на количество структур с данными о фильмах в самом файле или делить рамер файла на размер структур или ещё чего, ну не суть, просто не облажайся считав десять структур и сортируя 256.
do not use your brain

Последний раз редактировалось Stilet; 27.07.2013 в 10:37.
Кащей вне форума Ответить с цитированием
Старый 22.07.2013, 23:00   #6
Dima-War
Форумчанин
 
Регистрация: 17.03.2012
Сообщений: 105
По умолчанию

Уф... В общем все очень сложно.. И да, сортировку планирую сделать не только по году, ну и по названию. А вообще, я так понял, что мне рано еще писать такие программы..
Dima-War вне форума Ответить с цитированием
Старый 22.07.2013, 23:21   #7
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Не сы! Реляционную субд я пытался намалевать, почти удачно, тока исходник похерил, хотел вручить. Суть вот в чём - есть объект родительский и дочерний, всё что нужно связать их дав каждому объекту указатель на родителя, переменную с его уникальным номером, а объектом может быть просто структурка текст+переменная указывающая на предка+собственный номер.
То что я тебе описать пытался значит, что тебе нужно разработать структуру файла базы данных и структуру самих данных, тоесть отношения данных, их количество и предназначение.
Например отношение в базе данных как я описал выше можно использовать если строго распределить роли и количество записей по порядку и отношениям предок\потомок, чтобы небыло дикого мяса непонятно для чего являющегося потомком записи.
В таком случае, зная на пример, что у записи 5 потомков и зная их порядок ты считав их сможеш их раскидать как тебе надо.
do not use your brain

Последний раз редактировалось Кащей; 22.07.2013 в 23:24.
Кащей вне форума Ответить с цитированием
Старый 27.07.2013, 09:29   #8
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

Развели тут сопли. set используйте и лямбду, либо функцию сравнения двух структур.
чем раньще научитесь пользоваться STL'ем, тем лучше:
Код:
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>

struct A {
	int a;
	double b;

	A::A() {
		a = 0;
		b = 0.0;
	}

	A::A(const int _a, const double _b) {
		a = _a;
		b = _b;
	}

	bool operator () (const A& a, const A& b) const {
		if (a.a == b.a) {
			return a.b < b.b;
		} else {
			return a.a < b.a;
		}
	}
};

std::ostream& operator << (std::ostream& s, const A& a) {
	s << "a = " << a.a << "\tb = " << a.b << "\n";
	return s;
}

int _tmain(int argc, _TCHAR* argv[]) {
	A b(7, 7.0);
	A c(2, 19.0);
	A a(7, 5.0);

	std::set<A, A> set;
	set.insert(a);
	set.insert(b);
	set.insert(c);

	std::copy(set.begin(), set.end(), std::ostream_iterator<A>(std::cout, ""));

	return 0;
}

Последний раз редактировалось Kukurudza; 27.07.2013 в 09:55.
Kukurudza вне форума Ответить с цитированием
Старый 29.07.2013, 11:16   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

http://www.programmersforum.ru/showp...83&postcount=2
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка(сортировка Хоара). Сортировка фрагмента массива [C++] druger Помощь студентам 0 20.04.2012 15:49
Сортировка Шелла и Шейкер-сортировка AleksandrMakarov Паскаль, Turbo Pascal, PascalABC.NET 11 11.03.2012 12:18
Сортировка массива методами предсортировки и слияния, и пирамидальная сортировка. lenny_24 Помощь студентам 2 17.04.2011 18:57
паскаль,одномерный массив,сортировка вставка,сортировка убывания,от максимального до конца немозг Помощь студентам 11 06.02.2010 21:57
Сортировка файлов в Explorer vs сортировка в Delphi mutabor Общие вопросы Delphi 11 04.09.2009 14:32