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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2012, 11:38   #1
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию Функция сортировки в файле (С++)

Помогите пожалуйста. Надо написать функцию сортировки записанных структур в файле по одному из двух параметров (цена и количество градаций серого). Из файла вроде читывает в массив структур. после выполнения файл не пустой (хотя использую clear()), но и не отсортирован.
Пробовал сортировать по разному, но не получается.

Код:
int sortVFile(int l, int par){
	if (par<1 && par >2) { 
		cout << "Ошибка вызова по параметру";
		return -1;
	}
	fstream f("C:\\cpp\\text2.txt", ios_base::in|ios_base::out);
	if (!f.is_open()) {
		cout << "Ошибка открытия файла";
		return -1;
	} 
	int m;
	scan_info ma[100], prom;
	scan_info zapisi;

	// считываю из файла в массив структур
	f >> m;
	for (int i=0; i<l; i++){
		f >> ma[i].model;
		cout << ma[i].model << "\n";
		f >> ma[i].price;
		cout << ma[i].price<< "\n";
		f >> ma[i].x_size;
		cout << ma[i].x_size << "\n";
		f >> ma[i].y_size;
		cout << ma[i].y_size << "\n";
		f >> ma[i].optr;
		cout <<  ma[i].optr << "\n";
		f >> ma[i].grey;
		cout << ma[i].grey << "\n";
		}

	// Сортировка по price если par=1 или grey если par=2
	if (par==1) {
		for (int i=0; i<=l; i++)
		for (int j=0; j<l-1; j++)
			if (ma[j].price < ma[j+1].price){swap(ma[j].price, ma[j+1].price);
			/*	zapisi.model = ma[i].model;
				ma[i].model = ma[j+1].model;
				ma[j+1].model = zapisi.model;
				zapisi.price = ma[i].price;
				ma[i].price = ma[j+1].price;
				ma[j+1].price = zapisi.price;
				zapisi.x_size = ma[i].x_size;
				ma[i].x_size = ma[j+1].x_size ;
				ma[j+1].x_size = zapisi.x_size;
				zapisi.y_size = ma[i].y_size;
				ma[i].y_size = ma[j+1].y_size;
				ma[j+1].y_size = zapisi.y_size;
				zapisi.optr = ma[i].optr;
				ma[i].optr = ma[j+1].optr;
				ma[j+1].optr = zapisi.optr;
				zapisi.grey = ma[j].grey;
				ma[j].grey=ma[j+1].grey;
				ma[j+1].grey=zapisi.grey;
			*/
			} 
	}
			else {
		for (int i=0; i<=l; i++)
		for (int j=0; j<l-1; j++)
			if (ma[j].grey < ma[j+1].grey){
				zapisi.model = ma[i].model;
				ma[i].model = ma[j+1].model;
				ma[j+1].model = zapisi.model;
				zapisi.price = ma[i].price;
				ma[i].price = ma[j+1].price;
				ma[j+1].price = zapisi.price;
				zapisi.x_size = ma[i].x_size;
				ma[i].x_size = ma[j+1].x_size ;
				ma[j+1].x_size = zapisi.x_size;
				zapisi.y_size = ma[i].y_size;
				ma[i].y_size = ma[j+1].y_size;
				ma[j+1].y_size = zapisi.y_size;
				zapisi.optr = ma[i].optr;
				ma[i].optr = ma[j+1].optr;
				ma[j+1].optr = zapisi.optr;
				zapisi.grey = ma[j].grey;
				ma[j].grey=ma[j+1].grey;
				ma[j+1].grey=zapisi.grey;
				} 
			}
	
	f.clear();  // отчистил файл
		f << l<<"\n";

		// записываю отсортированный массив структур
		for (int i=0; i<l; i++){
		f << ma[i].model<<"\n";
		f << ma[i].price<<"\n";
		f << ma[i].x_size<<"\n";
		f << ma[i].y_size<<"\n";
		f << ma[i].optr<<"\n";
		f << ma[i].grey<<"\n";
	}
		f.close();
		return 0;
};
Человек

Последний раз редактировалось Артём Волжанкин; 20.07.2012 в 13:48.
Артём Волжанкин вне форума Ответить с цитированием
Старый 20.07.2012, 13:53   #2
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Тебя же просят отсортировать по 1 из двух параметров, а ты сортируеш все )

Для начала убери весь тот бардак и отсортируй хотя бы по одному параметру.

А если так?)

Код:
zapisi.price = ma[j].price;
ma[j].price = ma[j+1].price;
ma[j+1].price = zapisi.price;
или же выдели отдельную переменную вещественного или целого типа ( временную ), где хранятся сравниваемые ключи.

например
Код:
int buffer ;
.......
buffer = ma[j].price;
ma[j].price = ma[j+1].price;
ma[j+1].price = buffer;
Люблю на ты.Я человек простой

Последний раз редактировалось Leshii; 20.07.2012 в 14:02.
Leshii вне форума Ответить с цитированием
Старый 20.07.2012, 14:07   #3
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Leshii, не получается.
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 20.07.2012, 14:10   #4
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Я там отредактировал мой же пост выше, посмотри, второй вариант тоже не подходит?
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 20.07.2012, 14:20   #5
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

Leshii, вообще понять не могу почему не работает и второй вариант
Человек
Артём Волжанкин вне форума Ответить с цитированием
Старый 20.07.2012, 15:02   #6
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Код:
int buffer=0;          
    
    
    for (int i=1;  i<=l ;  i++)
      {
         for (int j=1;  j<=l-i;  j++)     
            {		
               if ( ma[j].price > ma[j+1].price )     
                 {
		  buffer = ma[j].price;
                  ma[j].price = ma[j+1].price;
                  ma[j+1].price = buffer;
                 }
            }
      }
Вот твоя сортировка обменом, и вот что заметил в твоем коде

Код:
for (int j=0; j<l-1; j++)
сравни

Код:
 for (int j=1;  j<=l-i;  j++)
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 20.07.2012, 15:15   #7
Артём Волжанкин
Пользователь
 
Аватар для Артём Волжанкин
 
Регистрация: 07.07.2012
Сообщений: 99
По умолчанию

массив с нуля же и выход за пределы

Кто ищет, тот всегда найдет.
Функция полностью работает. Пока не могу ее уменьшить. Комметарии проставил на случай, если кому-то понадобиться.

PS: обидно, что так мало людей готовы помочь

Код:
int sortVFile(int l, int par){
	
	// Проверка на ошибки
	if (par<1 && par >2) { 
		cout << "Ошибка вызова по параметру";
		return -1;
	}
	fstream f("C:\\cpp\\text2.txt", ios_base::in);
	if (!f.is_open()) {
		cout << "Ошибка открытия файла";
		return -1;
	} 

	//----------------------------------------------------------------------------

	int m;
	scan_info ma[100]; // массив считанных записей

	// считываю из файла в массив структур
	f >> m;
	for (int i=0; i<l; i++){
		f >> ma[i].model;
		f >> ma[i].price;
		f >> ma[i].x_size;
		f >> ma[i].y_size;
		f >> ma[i].optr;
		f >> ma[i].grey;
	}
	f.close();	

	//-----------------------------------------------------------------------
	// необходимые переменные для сортировки
	m=0;
	int mas[100], // массив необходим для постепенного исключения минимальных элементов
		mas2[100]; // массив порядка записи структур

	// Сортировка по price если par=1 или grey если par=2
	if (par==1) {
		for (int i=0; i<l; i++){
			m=0;
			while (mas[m]==1) m++;
			for (int j=0; j<l; j++)  // Нахожу минимальный элемент, а затем следующий после исключения 
			if ((ma[j].price <= ma[m].price) && (mas[j]!=1))
				m = j; 

		mas[m]=1;  // исключаем элемент как уже отсортированный 
		mas2[i]=m; // сохраняем номар для записи в файл
		}
	}

	// так же как и для предыдущего параметра
			else {
			for (int i=0; i<l; i++){
			m=0;
			while (mas[m]==1) m++;
			for (int j=0; j<l; j++)
			if ((ma[j].price <= ma[m].price) && (mas[j]!=1))
				m = j; 

		mas[m]=1;
		mas2[i]=m;
		}
			}

	//-----------------------------------------------------------
	// открываем файл для записи, отчищая его
	fstream fi("C:\\cpp\\text2.txt", ios_base::trunc|ios_base::out);
	if (!fi.is_open()) {
		cout << "Ошибка открытия файла";
		return -1;
	} 
	fi << l<<"\n"; // запись по заданию колличества записей
	for (int i=0; i<l; i++){
		fi << ma[mas2[i]].model << "\n";
		fi << ma[mas2[i]].price<< "\n";
		fi << ma[mas2[i]].x_size << "\n";
		fi << ma[mas2[i]].y_size << "\n";
		fi << ma[mas2[i]].optr << "\n";
		fi << ma[mas2[i]].grey << "\n";
	}
	fi.close();
		return 0;
};
Человек

Последний раз редактировалось Stilet; 20.07.2012 в 19:58.
Артём Волжанкин вне форума Ответить с цитированием
Старый 20.07.2012, 19:55   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
обидно, что так мало людей готовы помочь
Обидно что авторы тем не понимают что проблему нужно раскрывать полностью. И если речь идет о работе с уже готовым файлом, прикреплять и его, дабы сэкономить время тех, кто действительно может помочь, но не имеет времени на пересборку всего проекта темы с нуля.
Обидно, досадно... Ну ладно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
реализация сортировки в файле zomba Помощь студентам 1 20.07.2012 12:12
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
С++. Функция сортировки списка по значению Caged Помощь студентам 0 02.11.2011 21:01
функция сортировки массива работает не верно DroZd911 Помощь студентам 1 18.02.2011 05:33
Функция редактирования данных в текстовом файле Danil21 Помощь студентам 0 28.10.2009 01:12